我有以下用于实现 Tag Dispatching 的代码:
template <class T> struct tag
{
typedef struct {} type;
static const type value;
};
然后我在几个定义中使用这个结构来提供函数的重载版本,由于某种原因,这些版本可能是模棱两可的。例如,我有一组采用单个参数 unarchiver ar
的 unarchive
函数。后面的类型使用类型特征来决定要使用的重载版本,从而确定要取消存档的类型。这是一个取消存档数据包的示例:
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/