2012-04-21 85 views
16

我意識到類似的問題之前已經被問到過,但是我閱讀了其中的一些,但仍然沒有看到我要出錯的地方。當我簡單地寫我的類而不將原型與定義分開時,一切正常。」沒有使用模板參數「

template<class T> class VisitedSet { 
public: 
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private: 
    vector<T> vec; 
    int iteration; 
}; 

而作爲這給了我這個錯誤的定義的例子:

int VisitedSet::getSize() { 
    return vec.size(); 

我以前從未取得了模板類,當我分開的原型和定義如下圖所示的問題發生,所以請原諒,如果這裏的問題是微不足道的。

+0

注意:在大多數情況下,您希望頭中可以訪問模板成員函數的定義。如果定義在標題中,請記住將它們標記爲「inline」(或者在模板類定義中定義它們),如果它們不是,請仔細考慮並確保不需要標題中的定義(您可以如果在包含要使用該模板的* all *類型的定義的翻譯單元中顯式實例化,則不需要頭中的定義)。我擔心你很快會得到這個... – 2012-04-21 21:50:25

回答

28

VisitedSet是一個模板,而不是一類,所以你不能在嵌套名指定中使用這樣的VisitedSetVisitedSet::getSize()。正如您所指定的class VisitedSet<T>聲明所有class T,你必須指定所有class T的的VisitedSet<T>::getSize()定義:

template<class T> 
int VisitedSet<T>::getSize() { 
//   ^^^ 
    return vec.size(); 
} 

模板的名稱可以,但是,使用,就好像是中類模板定義:

template<class T> 
struct Example { 
    Example* parent; 
    T x, y; 
}; 

在這種情況下,Example是短期的Example<T>

0

嘗試把

template <typename T> 

VisitedSet實施上述::的getSize() - 但要注意的是,在一般情況下,模板類和函數都應該被內聯。有關更多信息,請參閱C++ faq here

+0

當我把'template '直接放在'int VisitedSet :: getSize(){'這一行的上面時,我會得到完全相同的錯誤。我最好是不要將原型與定義分開?在這種情況下,內聯是什麼意思? – synaptik 2012-04-21 21:12:54

+0

@synaptic在其他答案中,您還需要使用類中的模板參數。 – 2012-04-21 21:13:56

3

你想這樣的:

template <class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
2

您必須聲明模板參數的定義以及

template<class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 

否則編譯器不能與之相匹配的聲明。例如,某些參數類型可能存在專門化。

+0

我明白了。感謝大家。 – synaptik 2012-04-21 21:13:57

2

你需要讓你的編譯器知道你是在實現模板函數的方法:

template<typename T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
相關問題