类型特征模板类

时间:2016-11-17 11:20:37

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

我有以下代码用于实现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)文件中。任何人都可以确定原因吗?

1 个答案:

答案 0 :(得分:1)

这个:static const type value;是静态成员变量value的声明,它是一个promis,变量将在其他地方定义。

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

定义不仅仅是初始化。