2012-01-13 79 views
8

我是C++新手。今天,我有一個問題: 在頭文件中定義一個類:C++錯誤:找不到會員聲明

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

和源文件,我編程爲:

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

編譯時,編譯器總是說:「會員聲明未找到'。 爲什麼?

我用Eclipse CDT的+ Cygwin的GCC

非常感謝你!

+1

AFAIK你不應該在源文件中實現模板類。在標題中設置函數的定義。 – Lucian 2012-01-13 08:38:06

回答

6

模板類需要在頭文件或用戶包含的其他文件中聲明和定義。它們不能在頭文件中聲明,並像平常一樣在源文件中定義。

其原因在於模板必須替換爲實際類型以及使用時生成和編譯的模板的源代碼,編譯器肯定無法爲每種可能出現的類型預編譯模板,因此用戶需要能夠處理(並且需要訪問代碼)。

如果多個庫包含相同的模板,那麼在傳遞對象時會造成一些問題,因爲它們可能會針對不同版本的頭進行編譯(請參閱One Definition Rule)。

0

你應該包括在頭文件 結束你的源文件,或者你在頭文件中定義的成員函數當你定義一個模板類

1

「找不到成員聲明」是由Eclipse靜態分析產生錯誤工具(codan)而不是編譯器。如果你得到這個錯誤,但編譯成功,這是一個誤報。已知該工具的較舊版本會給出一些誤報,例如參見this bug report。所以我建議將Eclipse CDT更新爲最新版本。如果這沒有幫助,請向Eclipse CDT提交錯誤報告。然而,如果你也從編譯器中得到了錯誤(這些由Problems視圖的Type列中的C/C++問題表示),那麼你可能已經忘記了包含頭文件。