這裏定義一個符號是我的問題:在一個標題我定義一個結構模板type_to_string
,其目的是確定對應於給定類型的參數的字符串:在另一個命名空間
namespace foo {
template <typename T>
struct type_to_string
{
static const char * value;
};
}
template <typename T>
const char * foo::type_to_string<T>::value = "???";
我還定義默認值爲字符串。現在
,我想使用的宏定義新類型:
#define CREATE_ID(name) \
struct name; \
\
template<> \
const char * foo::type_to_string<name>::value = #name;
的問題是,我想宏在命名空間中使用,如:
namespace bar
{
CREATE_ID(baz)
}
這是不可能的,因爲type_to_string<T>::value
必須在包含foo
的命名空間中定義。
下面是編輯錯誤,我得到:
[COMEAU 4.3.10.1] error: member "foo::type_to_string<T>::value [with T=bar::baz]"
cannot be specialized in the current scope
[VISUAL C++ 2008] error C2888: 'const char *foo::type_to_string<T>::value' :
symbol cannot be defined within namespace 'bar'
with
[
T=bar::baz
]
奇怪的是,GCC 4.3.5(MinGW的版本)不會產生任何錯誤。
有沒有人知道這個解決方法,也許通過使用我不知道的一些查找規則(即在宏中聲明type_to_string
,以便每個命名空間有它自己的版本,或類似的東西)?
感謝標準中的段落,它總是很好的具備確切的要求。關於你的第二個解決方案,事實上我已經在做了:我有兩個參數,一個用於定義名稱空間,另一個用於類型。但是,我希望宏可以在另一個名稱空間中使用,以便不限制使用的名稱空間的數量。我可以用1,2,3,...參數定義CREATE_ID宏來接受幾個名稱空間名稱,但這樣會比較單調乏味。如果這是唯一的解決方案,我沒有太多的選擇... – 2009-09-24 12:09:11
爲了記錄,我最終使用Boost.Preprocessor將名稱空間列表傳遞給宏。這樣,名稱可以包含在幾個嵌套的名稱空間中。 – 2010-01-11 17:44:59