未定义对标头中定义的模板函数的引用

Undefined reference to template function defined in header

提问人:Jan 提问时间:8/28/2015 更新时间:8/28/2015 访问量:758

问:

我得到了这个调用的未定义引用:

Argonauts::Runtime::handleParseObject(m_val.m_type)

handleParseObject 函数在包含上述行的文件所包含的标头中定义,如下所示(在命名空间内):Argonauts::Runtime

template <typename Type> HandleParseAction handleParseObject(Type &) { return HandleParseAction("Unexpected value of type 'object'"); }

存在函数重载,此模板化函数应该是没有重载变体的任何类型的回退。

错误消息:

undefined reference to `Argonauts::Runtime::HandleParseAction Argonauts::Runtime::handleParseObject<SiteType>(SiteType&)'

在 SO 和使用 Google 上寻求帮助几乎毫无用处,因为所有结果都来自将模板函数的定义放在源文件中的人。

我可以通过使函数静态来消除错误,但我对此感到不安。这是正确的方法还是有更好的方法?

C++ 模板 链接器 C++14 未定义引用

评论

0赞 Paolo M 8/28/2015
是否存在类型的重载或特殊化?我的猜测是声明了重载,但未定义。SiteType&
0赞 Jan 8/28/2015
m_type是 类型的成员。这既没有重载也没有专用化,因此应调用模板化回退。m_valSiteType
0赞 JSF 8/28/2015
也许编译器对无限递归感到困惑。我希望你有一个无限递归,因为你认为带引号的字符串是一个,但实际上它不是。我希望你有一个重载,所以如果你将带引号的字符串转换为一个,它应该可以工作。char const*char const*char const*
2赞 R Sahu 8/28/2015
请发布 MCVE
1赞 Jan 8/29/2015
原来只是我傻了,我不小心在一个地方留下了超载的声明,所以它试图选择那个......

答: 暂无答案