2012-01-13 26 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; 
} 

:「メンバー今日、私は問題を抱えています宣言が見つかりません '。 なぜですか?私は日食CDT + CygwinのGCC

はどうもありがとうございました使用

+1

AFAIKソースファイルにテンプレートクラスを実装しないでください。ヘッダーに関数の定義を設定します。 – Lucian

答えて

6

テンプレートクラスは、ヘッダーまたはユーザーがインクルードする別のファイルで宣言して定義する必要があります。ヘッダーで宣言することはできず、通常のようにソースファイルで定義することもできません。

推論の理由は、テンプレートを実際の型に置き換える必要があり、使用時に生成され、コンパイルされたソースがあるため、コンパイラは可能なあらゆるタイプのテンプレートをプリコンパイルできないため、それを処理できるようになります(コードにアクセスする必要があります)。

複数のライブラリに同じテンプレートが含まれている場合、異なるバージョンのヘッダーに対してコンパイルできるため、オブジェクトを渡すときに問題が発生します(One Definition Ruleを参照)。

0

あなたはヘッダファイル の最後にソースファイルを含める必要がありますかあなたはテンプレートクラス

1

「見つからないメンバーの宣言は、」Eclipseの静的解析によって生成エラーで定義するときは、ヘッダファイルでメンバ関数を定義しますコンパイラではなくツール(codan)。このエラーが発生したが、コンパイルが成功すると、これは偽陽性です。このツールの以前のバージョンでは、いくつかの誤検出が報告されています。たとえば、this bug reportを参照してください。 Eclipse CDTを最新のバージョンにアップデートすることをお勧めします。これで問題が解決しない場合は、バグレポートをEclipse CDTに提出してください。

しかし、コンパイラからエラーが発生した場合(これらは「問題」ビューの「タイプ」列に「C/C++の問題」と表示されます)、ヘッダーファイルを含めるのはおそらく忘れてしまいました。

関連する問題