1

我正在處理一個堆棧類並有兩個構造函數。有趣的是這一個。模板類構造器中的動態分配

template <typename T> 
stack<T>::stack(const int n) 
{ 
capacity = n ; 
size = 0 ; 
arr = new T [capacity] ; 
} 

我在這裏稱它爲主。

stack<int> s1(3) ; 

該程序編譯得很好,但我得到這個運行時錯誤。

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall 
stack<int>::~stack<int>(void)" ([email protected]@@[email protected]) referenced in function _main 

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall  
stack<int>::stack<int>(int)" ([email protected]@@[email protected]@Z) referenced in function _main 

1>D:\\Microsoft Visual Studio 10.0\Visual Studio 2010\Projects\Expression 
Evaluation\Debug\Expression Evaluation.exe : fatal error LNK1120: 2 unresolved externals 

我正在Microsoft visual studio 2010上工作,這個問題讓我無處可去。 任何提示將不勝感激。

回答

3

這不是一個運行時錯誤,它是一個鏈接器錯誤。問題可能是構造函數和析構函數的實現在源文件中。使用模板類時,必須將所有方法的實現放置在標題中(或使用它們的源文件中,但這相當於將它們放在標題中)。

所以基本上做到這一點:

template<class T> 
class stack 
{ 
public: 
    stack(const int n) 
    { 
     capacity = n ; 
     size = 0 ; 
     arr = new T [capacity] ; 
    } 

    // and the same for all other method implementations 
}; 
+1

這比普通班不同,因爲編譯器需要生成代碼,其中的模板類*使用*('main.cpp'),而不是它在哪裏*實現*(即'stack.cpp'),因爲只有實例化模板的代碼知道它將使用哪些具體類型。 – willglynn

+0

好的謝謝,工作正常。 和@willglynn也是如此。 – Sasha