我正在尝试以下内容:
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 :(
答案 0 :(得分:6)
从g ++判断我认为您需要从该行中删除template<>
并将余数放在一个源文件中(不在标题中)。由于它是一种特殊化,它就像一个普通的非模板静态,你没有在标题中定义。
在某些.C
文件中:
const MyType * const Test<void>::sm_object = new MyType();
答案 1 :(得分:2)
我相信你想做这样的事情
struct MyType { };
template <typename T>
struct Test
{
static const MyType * const sm_object;
static const MyType* set_object()
{
return nullptr;
}
};
template <>
struct Test<void>
{
static const MyType * const sm_object;
static const MyType* set_object()
{
return new MyType();
}
};
template <typename T>
const MyType * Test<T>::sm_object = Test< T >::set_object();
答案 2 :(得分:0)
我认为以下代码可能对某些人非常感兴趣:
#include <stdio.h>
template<class X,int Y>
struct B
{
X content;
static const int nr=Y;
};
int main(int, char**)
{
B<char,1> a;
B<int,2> b;
B<int,3> c;
printf("%d, %d, %d\n",a.nr,b.nr,c.nr);
}