4

我正在尝试类似以下的事情:

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

4

3 回答 3

6

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

在某些.C文件中:

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

于 2011-01-05T15:04:36.523 回答
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();
于 2011-03-23T10:16:56.043 回答
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);
}
于 2011-02-09T23:28:37.627 回答