我有下面的代码用于实现标签调度
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未解决的外部符号"public: static::type const tag::value“(?value@?$tag@G@@2Utype@12@B)
struct tag声明位于它自己的头(.h)中,并且这些用法显示在所有的实现(.cpp)文件中。有人能找出原因吗?
发布于 2016-11-17 13:13:16
这是:static const type value;是静态成员变量value的声明,它是在其他地方定义变量的前提。
这是:template <class T> const typename tag<T>::type tag<T>::value;是一个定义。
定义不仅仅是初始化。
https://stackoverflow.com/questions/40653588
复制相似问题