template<typename Type>
class List
{
public:
List(void);
~List(void);
...
}
由继承的
template<typename Type>
class LinkedList : public List<Type>
{
public:
LinkedList(void);
~LinkedList(void);
...
}
但是当我
List<int>* list = new LinkedList<int>();
来了
error LNK2019: unresolved external symbol "public: __thiscall LinkedList<int>::LinkedList<int>(void)" (??0?$LinkedList@H@@QAE@XZ) referenced in function _wmain
我知道对于模板,在编译时确定类型,我觉得在编译时确定typename Type应该没问题,然后在运行时确定派生类类型。是否可以以这种方式将多态性与模板类一起使用?
/////////////////////////////////////////////// /////////////////////////////////
感谢hkaiser和Chubsdad,这是链接问题。 我在cpp文件中定义了构造函数,但链接器无法以某种方式检测到它。我试图将它移动到头文件,它工作,但我不喜欢。 如果我使用已解析的类型在cpp中定义函数似乎没问题,例如:
LinkedList<int>::LinkedList(void)
:List<int>()
{
mHead = new Node<int>(0);
}
而不是:
template<typename Type>
LinkedList<Type>::LinkedList(void)
:List<Type>()
{
mHead = new Node<Type>(0);
}
但有什么区别?为什么它在模板定义时变得不可见,而在解析后可见?是否可以在cpp?
中定义模板成员函数答案 0 :(得分:2)
错误是由链接器生成的,因为您没有为LinkedList
类定义构造函数。或者,如上所示,编译器在使用类型LinkedList<int>
的位置不可见。
答案 1 :(得分:1)
构造函数和析构函数的定义在哪里?链接器抱怨这个。
This也可能有所帮助
答案 2 :(得分:0)
嗯,这似乎是一个老问题,cpp的一个棘手的贬值可以解决这个问题:
template LinkedList<int>::LinkedList(void);
避免在.h文件中定义是一种妥协,但您必须为每个使用的类型声明。一个简单的解决方案是在.h文件中定义函数,或者根据http://www.parashift.com/c++-faq-lite/templates.html [35.14],使用关键字导出有一个看似有争议的解决方案。 这是一个有用的问题:Storing C++ template function definitions in a .CPP file
答案 3 :(得分:0)
我遇到了同样的问题,将头文件分成了两个。第一个头文件声明了基本模板类,第二个包含cpp实现,然后是派生类。我宁愿再使用一个头文件而不是实现它,或者为每种类型实现~20个方法。