2011-02-01 24 views
2

當我將所有源代碼放入一個文件時,該程序成功構建。但是,當我將它們拆分爲頭文件時,出現鏈接錯誤。如何在C++中編譯位於不同文件中的模板?

主要我的程序: //C++_Class_Templates.cpp

#include <iostream> 
#include <vector> 
#include "Queue.h" 

using namespace std; 

//Usage for C++ class templates 
void main() 
{ 
    MyQueue<int> q; 
    q.Add(1); 
    q.Add(2); 
} 

的Queue.h看起來像這樣

#pragma once 
#include <vector> 

template <typename T> 
class MyQueue 
{ 
    std::vector<T> data; 
    public: 
    void Add(T const &); 
    void Remove(); 
    void Print(); 

}; 

和Queue.cpp看起來是這樣的:

#include "Queue.h" 

template <typename T> void MyQueue<T> ::Add(T const &d) 
{ 
    data.push_back(d); 
} 

當我嘗試構建它時,出現此錯誤:

1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall 
MyQueue<int>::Add(int const &)" ([email protected][email protected]@@[email protected]) referenced in function _main 
+0

你是如何編譯這個的? – Falmarri 2011-02-01 23:58:10

回答

1

爲模板分離聲明和定義並不是微不足道的。

編譯器必須看到定義能夠編譯專門化,但它也必須知道要使用的參數。 C++被設計爲一次編譯一個「編譯單元」,並且這兩個部分(定義和參數)必須同時可見。

因此,無論是將模板的實現文件中需要的所有專業化列表全部放入,還是將整個定義放入.h文件中。然而,這兩種解決方案都有缺點。

請參閱this answer以解決您面臨的相同問題,以獲得更完整的解釋。

相關問題