类型特征模板的未解析外部符号 class
Unresolved external symbol for type traits template class
我有以下代码用于实现 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
的声明,这是对变量将在别处定义的承诺。
这个:template <class T> const typename tag<T>::type tag<T>::value;
是一个定义。
定义不仅仅是初始化。
我有以下代码用于实现 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
的声明,这是对变量将在别处定义的承诺。
这个:template <class T> const typename tag<T>::type tag<T>::value;
是一个定义。
定义不仅仅是初始化。