【发布时间】:2011-01-05 14:57:01
【问题描述】:
我正在尝试以下操作:
struct MyType { };
template <typename T>
struct Test
{
static const MyType * const sm_object;
};
template <>
struct Test<void>
{
static const MyType * const sm_object;
};
template <typename T> const MyType * const Test<T>::sm_object = new MyType();
template <> const MyType * const Test<void>::sm_object = new MyType();
我将它包含在 2 个文件中 - a.cpp 和 b.cpp。我尝试编译并得到:
error C2998: 'const MyType *Test<void>::sm_object' : cannot be a template definition
我认为我的 C++ 语法不好,但我想不出我做错了什么。
我无法从变量定义中删除 template<>,因为我需要在多个翻译单元中使用它,这会导致链接错误。
我可以将字段放入基类并使用 CRTP 为每种类型创建一个新实例,然后专业化就不会妨碍,但为什么这种“直接”字段初始化不起作用?我一定是遗漏了一些语法。
我正在使用 VS2003 :(
【问题讨论】:
-
答案是正确的,但我最终使用了一个包含 sm_object 的新结构 TestHolder
,然后只需要对持有者类进行一次静态初始化,而不是部分专门化的。
标签: c++ templates static-members template-specialization