模板類的聲明和定義要放在同一個文件

定義一個類通常都是在頭文件中進行類聲明,在cpp文件中實現,但使用模板時應注意目前的C++編譯器還沒法分離編譯,最好將實現代碼和聲明代碼均放在頭 文件中。如:

test.h

template <class T>
class CTest
{  
public:        
  T& GetValue();        
  void SetValue(const T& _Value);
protected:
  T m_Value;
};

test.cpp

template <class T>
T& CTest<T>::GetValue()
{    
   return m_Value;  
}

template<class T>
void CTest<T>::SetValue(const T& _Value)
{          
   m_Value   =   _Value;  
}

在這兒test.cpp中的內容應放在test.h中,不然在生成最終可執行程序時就會出現錯誤(在連接時會出錯)。由於在編譯時模板並不能生成真正的二進制代碼,而是在編譯調用模板類或函數的CPP文件時纔會去找對應的模板聲明和實現,在這種狀況下編譯器是不知道實現模板類或函數的CPP文件的存在,因此它只能找到模板類或函數的聲明而找不到實現,而只好建立一個符號寄但願於連接程序找地址。但模板類或函數的實現並不能被編譯成二進制代碼,結果連接程序找不到地址只好報錯了。

《C++編程思想》第15章(第300頁)說明了緣由:
模板定義很特殊。由template<…> 處理的任何東西都意味着編譯器在當時不爲它分配存儲空間,它一直處於等待狀態直到被一個模板實例告知。在編譯器和鏈接器的某一處,有一機制能去掉指定模板的多重定義。因此爲了容易使用,幾乎老是在頭文件中放置所有的模板聲明和定義。編程

相關文章
相關標籤/搜索