我有以下代码用于实现Tag Dispatching:
template <class T> struct tag
{
typedef struct {} type;
static const type value;
};
然后我在几个定义中使用这个结构来提供过载的函数版本,这些函数由于某种原因可能是模糊的。例如,我有一组unarchive
函数,它们采用单个参数unarchiver ar
。后面的类型使用类型特征来决定要使用的重载版本,从而确定要取消归档的类型。以下是取消归档数据包的示例:
packet HYP_NAMESPACE unarchive(unarchiver ar, typename tag<packet>::type)
{
// Code here
}
这可以像这样调用:
unarchive(ar, tag<packet>::value);
此代码适用于gcc和clang,但它在VS 2015中失败。我只是遇到了一堆错误:
LNK2001未解析的外部符号&#34; public:static struct tag :: type const tag :: value&#34; (α值@?$标签@ @@ģ@ 2Utype 12 @ B)
struct tag
声明位于自己的标题(.h)中,并且这些用法出现在所有实现(.cpp)文件中。任何人都可以确定原因吗?
答案 0 :(得分:1)
这个:static const type value;
是静态成员变量value
的声明,它是一个promis,变量将在其他地方定义。
这:template <class T> const typename tag<T>::type tag<T>::value;
是一个定义。
定义不仅仅是初始化。