2013-07-03 73 views
-1

我有3個文件 - main,Array.hh和Array.cc。當我做「g ++ main.cc Array.cc」,我得到各種鏈接器錯誤,例如:「未定義的參考數組< < \ double >> :: Array(int)」模板代碼鏈接錯誤

我讀了另一個stackoverflow鏈接器錯誤與模板的條目,但他們建議分裂HH和CC文件,我已經做了。那麼這裏有什麼問題?

編輯:謝謝你的回覆。我沒有理解我之前讀過的帖子。將Array.cc合併到Array.hh中解決了這個問題。關閉。

main.cc:

#include "Array.hh" 
#include <iostream> 

int main() { 
    Array<int> anArray(12); 
    Array<double> adArray(12); 

    for (int nCount = 0; nCount < 12; nCount++) { 
     anArray[nCount] = nCount; 
     adArray[nCount] = nCount + 0.5; 
    } 

    for (int nCount = 11; nCount >= 0; nCount--) 
     std::cout << anArray[nCount] << "\t" << adArray[nCount] 
     << std::endl; 

    return 0; 
} 

Array.hh:

template <typename T> 
class Array { 
    private: 
     int m_nLength; 
     T *m_ptData; 

    public: 
     Array(); 
     Array(int nLength); 
     ~Array(); 
     void Erase(); 
     T& operator[](int nIndex); 
     int GetLength(); 
}; 

Array.cc

#include "Array.hh" 
template <typename T> 
Array<T>::Array() { 
    m_nLength = 0; 
    m_ptData = 0; 
} 

template <typename T> 
Array<T>::Array(int nLength) { 
    m_ptData= new T[nLength]; 
    m_nLength = nLength; 
} 

template <typename T> 
Array<T>::~Array() { delete[] m_ptData; } 

template <typename T> 
void Array<T>::Erase() { 
    delete[] m_ptData; 
    m_ptData= 0; 
    m_nLength = 0; 
} 

template <typename T> 
int Array<T>::GetLength() { return m_nLength; } 
+3

「我使用模板讀取了鏈接器錯誤的其他stackoverflow條目,但他們建議分割HH和CC文件」 - 他們沒有辦法建議,這正是導致錯誤的原因。 – interjay

回答

0

4:24 Array.cc定義成Array.hh

當使用模板類時,一個類 被建造。 Array.cc不知道應該從模板創建哪些類,只有main.cc知道這一點。 main.cc不知道如何創建類,因爲它不知道Array的成員函數的定義,只有Array.cc知道。

0

您需要#include "Array.cc"

如果定義不可用的模板不能被實例化。

定義和申報的這種分離是好的,但你必須包括cc文件。無論您在instatiating該模板的一種新型你把不是很準確