【发布时间】:2016-11-17 11:20:36
【问题描述】:
我有以下代码用于实现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 未解析的外部符号“public: static struct tag::type const tag::value”(?value@?$tag@G@@2Utype@12@B)
struct tag 声明位于其自己的标头 (.h) 中,其用法出现在整个实现 (.cpp) 文件中。谁能确定造成这种情况的原因?
【问题讨论】:
-
你在哪里明确定义你的静态成员变量?
-
嗯.. 没想到。我不。在这种情况下,我不需要初始化的特定值,如果它包含垃圾应该没问题。您认为这是导致错误的原因吗?
标签: c++ c++11 templates visual-studio-2015 typetraits