类型特征模板的未解析外部符号 class

Unresolved external symbol for type traits template class

我有以下代码用于实现 Tag Dispatching:

template <class T> struct tag
{
    typedef struct {} type;
   static const type value;
};

然后我在几个定义中使用这个结构来提供函数的重载版本,由于某种原因,这些版本可能是模棱两可的。例如,我有一组采用单个参数 unarchiver arunarchive 函数。后面的类型使用类型特征来决定要使用的重载版本,从而确定要取消存档的类型。这是一个取消存档数据包的示例:

packet HYP_NAMESPACE unarchive(unarchiver ar, typename tag<packet>::type)
{
    // Code here
}

可以这样调用:

unarchive(ar, tag<packet>::value);

此代码适用于 gcc 和 clang,但它在 VS 2015 中失败。我只是收到一堆错误,例如:

LNK2001 unresolved external symbol "public: static struct tag::type const tag::value" (?value@?$tag@G@@2Utype@12@B)

struct tag 声明在它自己的 header (.h) 中,并且用法出现在整个实现 (.cpp) 文件中。谁能找出造成这种情况的原因?

这:static const type value;是静态成员变量value的声明,这是对变量将在别处定义的承诺。

这个:template <class T> const typename tag<T>::type tag<T>::value;是一个定义。

定义不仅仅是初始化。