2010-11-04 95 views
1
template<typename Type> 
class List 
{ 
public: 
    List(void); 
    ~List(void); 
... 
} 

它继承了C++多态性与模板类

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)" ([email protected]@@[email protected]) referenced in function _wmain

我知道,模板类型时确定编译,我觉得应该可以确定typename Type的时候com打桩,然后在运行时确定派生类的类型。以这种方式使用模板类可以使用多态吗?

////////////////////////////////////////////// //////////////////////////////////

感谢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中定义模板成员函数?由链接产生

回答

2

的错误,因为你没有定义构造函数LinkedList类。或者,在使用LinkedList<int>类型时,编译器不可见,如上所示。

1

其中是构造函数和析构函数的定义?链接器正在抱怨。

This也可能会有所帮助

0

嗯,这似乎是一个老问题,在CPP一个棘手的decleration可以解决这个问题:

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

0

我遇到了同样的问题,将头文件分解为两部分。第一个头文件声明了基本模板类,第二个包含了cpp实现,然后是派生类。我宁愿多一个头文件而不是实现它,或者为每种类型实现〜20个方法。