【发布时间】:2014-03-08 15:49:53
【问题描述】:
我有一个模板结构来存储 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 []’
因为我需要能够迭代这个数组,所以,我被卡住了......有什么建议吗?当然,我不想在某个地方指定数组的大小,但也许这是唯一的可能性。
【问题讨论】:
-
或许可以考虑使用带有静态成员函数的
std::array来代替? -
我已经实现了完全相同的行为。但是我的实现使用了一个定义良好的接口,如下所示:
std::string ToString(const T& enumValue);。在两个std::maps 下使用类似于“双向地图”。通过将公共代码和代码拆分为两个单独的类(Ènum<T>和EnumImpl<T>),一个人不必复制粘贴公共代码(std::map,查找等;这是另一个非常重要的原因是惰性初始化,因为这些类的使用系统对于init来说非常复杂),但只需要专门化EnumImpl<T>::Initialize() -
当然我的方法有点慢(因为
std::map不是静态的)。但是我的用例与运行时无关,所以这不是一个大问题,在这种情况下,我更喜欢干净的代码而不是速度。
标签: c++ arrays templates static