C++ &引用;错误LNK2019:未解析的外部符号;使用模板时

C++ &引用;错误LNK2019:未解析的外部符号;使用模板时,c++,templates,C++,Templates,可能重复: 我在代码中使用模板,但始终存在错误LNK2019。以下是我的部分代码: 方法.h template<typename type> void Method(Model<type>* sys); template<typename type> void Method(Model<type>* sys){ /*Your code here*/ }; 模板 无效方法(型号*sys); 方法.cpp template<typenam

可能重复:

我在代码中使用模板,但始终存在错误LNK2019。以下是我的部分代码:

方法.h

template<typename type>
void Method(Model<type>* sys);
template<typename type>
void Method(Model<type>* sys){ /*Your code here*/ };
模板
无效方法(型号*sys);
方法.cpp

template<typename type>
void Method(Model<type>* sys){ blablabla;}
模板
void方法(Model*sys){blabla;}
模型h

template<typename type>
class Model{ blablabla;}

class Model1:public Model<double>{ blablabla;}
模板
类模型{blabla;}
类Model1:公共模型{blabla;}
Main.cpp

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

但是,始终显示一个错误LNK2019:未解析的外部符号“void”\u\u cdec1方法(类模型*)”在函数\u main中引用。有人知道我哪里出错了吗?非常感谢

模板应在标题中实现

方法.h

template<typename type>
void Method(Model<type>* sys);
template<typename type>
void Method(Model<type>* sys){ /*Your code here*/ };
模板
void方法(Model*sys){/*此处的代码*/};
另见:

发件人:


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

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


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


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

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

将实现放在头中…此“问题”中的大多数问题的名称如下:“未解析的外部符号bla bla bla模板".. 当你输入问题的标题时,所有这些都会作为建议出现。注意!马克,我想把你说的话写进我的答案里。它给出了一个非常简单的解释,解释了为什么会发生这种情况,这可能会帮助任何未来的游客。@Drise,谢谢你的提问。StackOverflow鼓励这种答案合并,作为长期的StackOverflow助推器,我完全赞成。说吧,不客气。感谢您允许我这么做。严格来说,不需要在头文件中实现模板,只要某个源文件使用您将在代码中其他地方使用的模板参数提供实现。但实际上,每个人都是这样做的,因为它总是有效的。与其在头文件中实现它,不如将.cpp文件包含在头文件中,而不是.h文件中,这样做更简单,并且解决了问题。我认为,任何定义事物的东西都应该在头文件中,任何真正做事情的东西都应该在头文件中(即实现的函数等)应该在cpp文件中。这样可以保持代码干净,并便于其他读者浏览。