c++ - 静态字段初始化的模板部分特化

标签 c++ templates static-members template-specialization

我正在尝试以下操作:

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 :(

最佳答案

从 g++ 来看,我认为你需要删除 template<>从该行开始并将其余部分放在一个源文件中(不在标题中)。由于它是一个特化,它就像一个普通的非模板静态,您不在 header 中定义。

在一些.C文件:

const MyType * const Test<void>::sm_object = new MyType();

关于c++ - 静态字段初始化的模板部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4605440/

相关文章:

c++ - opencv-访问四边形中的所有像素

c++ - 图中循环的并集

templates - 将引用线添加到 SAS 热图

c++ - 模板的私有(private)静态变量成员的 undefined symbol

c++ - 内置类型有默认构造函数吗?

c++ - tbb-tasks 没有收到给定的参数

python bottle framework - 如何将字典传递给嵌套模板?

c++ - 模板参数在部分特化中不可推导

c++ - cpp : expected primary-expression before ‘.’ token

php - 静态成员不能用作 PHP5 中的默认函数参数?