【问题标题】:"error LNK2019: unresolved external symbol" when using templates [duplicate]使用模板时出现“错误 LNK2019:无法解析的外部符号”[重复]
【发布时间】:2012-07-15 19:04:05
【问题描述】:

可能重复:
Why do I get “unresolved external symbol” errors when using templates?

我在我的代码中使用模板,但总是出现错误 LNK2019。这是我的代码的一部分:

方法.h

template<typename type>
void Method(Model<type>* sys);

方法.cpp

template<typename type>
void Method(Model<type>* sys){ blablabla;}

模型.h

template<typename type>
class Model{ blablabla;}

class Model1:public Model<double>{ blablabla;}

Main.cpp

Model<double> *sys=new Model1();
Method(sys);

但是,总是显示错误 LNK2019: unresolved external symbol "void __cdec1 Method(class Model*)" referenced in function_main.有人知道我哪里出错了吗?非常感谢!

【问题讨论】:

  • 将实现放在标题中...
  • 这个“问题”的大部分问题都这样命名:“未解决的外部符号 bla-bla-bla 模板”.. 所有这些都会作为建议出现,而你输入问题的标题。请注意!

标签: c++ templates


【解决方案1】:

模板应在标头中实现。

方法.h

template<typename type>
void Method(Model<type>* sys){ /*Your code here*/ };

另请参阅:https://stackoverflow.com/a/495056/868546

来自Mark Ransom

在.cpp文件中,当你在其他文件中使用该函数时,编译器无法猜测模板参数是什么,因此它不会生成任何实际代码。链接器注意到缺少代码并抱怨。

通常的方法是在头文件中定义整个函数体,就像一个内联函数,这样编译器可以在看到正在使用的函数被填充了模板参数时发出代码。

【讨论】:

  • 在头文件中实现模板并不是绝对必要的,只要某个源文件提供了使用模板参数的实现,您将在代码的其他地方使用该参数。但实际上,这是每个人都这样做的方式,因为它总是有效的。
  • 不是在头文件中实现,而是包含.cpp文件而不是.h文件,它更简单并且解决了问题
  • 我认为任何定义的东西都应该在头文件中,而任何实际做东西的东西(即实现的功能等)都应该在cpp文件中.这使代码保持整洁,其他读者也可以轻松浏览。
【解决方案2】:

在.cpp文件中,当你在其他文件中使用该函数时,编译器无法猜测模板参数是什么,因此它不会生成任何实际代码。链接器注意到缺少代码并抱怨。

通常的方法是在头文件中定义整个函数体,就像一个内联函数,这样编译器可以在看到正在使用的函数被填充了模板参数时发出代码。

【讨论】:

  • 马克,我想将您所说的内容包含在我的回答中。它对为什么会发生这种情况给出了一个非常简单的解释,这可以帮助任何未来的访问者。
  • @Drise,感谢您的提问。 StackOverflow 鼓励这种答案合并,作为一个长期的 StackOverflow 助推器,我都赞成。继续前进。
  • 不客气。感谢您允许我这样做。
【解决方案3】:

模板应该在标头中实现,或者您可以使用模板函数/类的显式实例化

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2013-01-28
    • 2013-06-15
    相关资源
    最近更新 更多