c++ - 类型特征模板类的未解析外部符号

标签 c++ c++11 templates visual-studio-2015 typetraits

我有以下用于实现 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 , promise 该变量将在其他地方定义。

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

定义不仅仅是初始化。

关于c++ - 类型特征模板类的未解析外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40653588/

相关文章:

c++ - 使用 MySQL C++ 连接器连接被拒绝

c++ - 带有指针模板参数的模板类的特化

c++ - 带有 g++ -O2(或 -Os、-O、-O1、...)的模板警告

c++ - 占位符可以与 ref() 一起使用吗

c++ - initializer_list 作为数组引用参数的参数?

c++ - 没有用户代码的死锁

c++ - 纯右值的结果

c++ - 函数的签名

c++ - cout 同步关闭时的速度

c++ - 我类的意外加法运算符