我有一个模板化的结构来存储static char*
数组,如下所示:
template<typename T>
struct EnumStrings {
static const char* const data[];
};
我想以这种方式专注:
template<> const char* const EnumStrings<SomeType>::data[] =
{"item1", "item2", "item3", "item4"};
如果我将此实例化放在头文件中,并且此头文件包含在多个单元中,我会收到此链接器错误:
multiple definition of `EnumStrings<SomeType>::data'
现在,如果我将此实例化放在cpp文件中,使用data
数组的其他代码无法使用sizeof
运算符推断其大小,从而导致以下错误:
error: invalid application of ‘sizeof’ to incomplete type ‘const char* const []’
因为我需要能够迭代这个数组,所以,我被卡住了......有什么建议吗?当然,我不想在某处指定数组的大小,但也许这是唯一的可能性。
答案 0 :(得分:1)
在C ++ 11中如下作品:
// In header:
class SomeType;
template<typename T> struct EnumStrings;
template<>
struct EnumStrings<SomeType> {
static constexpr
const char* const data[] =
{"item1", "item2", "item3", "item4"};
};
// in cpp, if address of data is taken.
constexpr
const char* const EnumStrings<SomeType>::data[];
答案 1 :(得分:1)
您应该划分data
数组专门化的声明和定义。把它放在你的头文件中:
template<typename T>
struct EnumStrings {
static const char* const data[];
};
// declaration of `data` array specialization
template<> const char* const EnumStrings<SomeType>::data[4];
这在您的cpp
文件中:
// definition of `data` array specialization
template<> const char* const EnumStrings<SomeType>::data[] =
{"item1", "item2", "item3", "item4"};
答案 2 :(得分:0)
您可以将数据数组特化的结构声明和定义放在匿名命名空间中。然后,Struct将具有内部链接,这可以防止多个定义错误。
namespace {
template<typename T>
struct EnumStrings {
static const char* const data[];
};
template<> const char* const EnumStrings<int>::data[] =
{"item1", "item2", "item3", "item4"};
}