使用另一个模板类链接一个模板类(错误 LNK2001)
Posted
技术标签:
【中文标题】使用另一个模板类链接一个模板类(错误 LNK2001)【英文标题】:Linking a template class using another template class (error LNK2001) 【发布时间】:2010-06-11 12:36:11 【问题描述】:我使用一个抽象模板类和两个子类实现了“策略”设计模式。是这样的:
template <class T>
class Neighbourhood
public:
virtual void alter(std::vector<T>& array, int i1, int i2) = 0;
;
和
template <class T>
class Swap : public Neighbourhood<T>
public:
virtual void alter(std::vector<T>& array, int i1, int i2);
;
还有一个子类,和这个一样,alter
是在cpp文件中实现的。好的!现在我在另一个类中声明另一个方法(当然包括neighbourhood
头文件),像这样:
void lSearch(/*parameters*/, Neighbourhood<LotSolutionInformation> nhood);
它编译得很好而且很干净。开始链接时,出现以下错误:
1>SolverFV.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall lsc::Neighbourhood<class LotSolutionInformation>::alter(class std::vector<class LotSolutionInformation,class std::allocator<class LotSolutionInformation> > &,int,int)" (?alter@?$Neighbourhood@VLotSolutionInformation@@@lsc@@UAEXAAV?$vector@VLotSolutionInformation@@V?$allocator@VLotSolutionInformation@@@std@@@std@@HH@Z)
【问题讨论】:
【参考方案1】:还有另一个子类,就像 这个,alter 是在 cpp 文件。
不行-它必须在标题中。
【讨论】:
哦,是的,这也是。由于 C++ 非常适合做很多事情,我什至忘记了它作为一种 OO 语言是多么糟糕......:/【参考方案2】:这似乎是一个相当新手的错误。由于 Neighborhood 是一个抽象类,我必须始终将它用作指针(EDIT: 或引用),因为它绝不能被实例化。
更改了签名,效果很好。
编辑:另外,感谢 Neil,我知道“它必须在标题中”。
【讨论】:
事实上,您可能更喜欢使用对 Neighborhood 的引用而不是指针。 如果不是说你必须使用指针,我会赞成。 @Luc 说什么以上是关于使用另一个模板类链接一个模板类(错误 LNK2001)的主要内容,如果未能解决你的问题,请参考以下文章
链接来自另一个文件的函数时,Qt 上出现错误 LNK 2019 [重复]