2010-11-04 92 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個方法。