C ++与模板类的多态性

时间:2010-11-04 02:41:01

标签: c++ templates polymorphism

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?

中定义模板成员函数

4 个答案:

答案 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个方法。