模板专业化与静态char *数组成员,多个单元的instanciation

时间:2014-03-08 15:49:54

标签: c++ arrays templates static

我有一个模板化的结构来存储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 []’

因为我需要能够迭代这个数组,所以,我被卡住了......有什么建议吗?当然,我不想在某处指定数组的大小,但也许这是唯一的可能性。

3 个答案:

答案 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"};
}