2016-09-01 14 views
-3

C++のテンプレートの仕組みを理解するために少しプロジェクトを進めています。 (「;」「<」の前にエラーC2143、不足している)私は私のプログラムをコンパイルしようとすると、C++クラスのテンプレートを関数の戻り値の型として返します。

class Base{ 
public: 
    MyOperation<Base> operate(Base x){ return MyOperation<Base>(x); } //error here 
}; 

//... 

template<class B> 
class MyOperation : public Base{ 
public: 
    B b; 
    MyOperation(B b_){ b = b_; } 
}; 

、私はエラーを取得: は基本的に、私のようなものを持っています。 MyOperationをfuncionの戻り値の型として持つことができないからです()?

ありがとうございます。

+4

この 'テンプレート(クラスB)'は正しい構文ですか? – nbro

+0

コンパイラはあなたにその行を表示します。一般的に、エラーに構文が記述されていると、構文が乱れてしまいます。ここで 'template(クラスB)'は 'template 'でなければなりません。あなたの擬似コードかもしれません、そうでなければ、私はこれに答えを投稿します。 – TankorSmash

+1

'Base'は定義されているので' MyOperation'を参照できません。 –

答えて

3

テンプレートを宣言するための構文は、template<class B>(または同等にはtemplate<typename B>)です。

Baseの参照MyOperation(返品の種類と内部のoperateの機能)もあります。したがって、をBaseより前に定義する必要があります。

しかし、MyOperationBase(基本クラス)を参照してください。

基本クラスと関数内で使用するためには、完全な定義が必要です。しかし、返品タイプの場合、型が不完全です。で十分です。 MyOperationの定義の後、class Base { ... }の外(宣言されていない)に定義する必要がoperate()

template<class B> class MyOperation; 

それに加えて:だからMyOperationは次のように、Base前にあらかじめ宣言する必要があります。正しいコードは次のようになります

// pre-declaration of MyOperation 
template<class B> class MyOperation; 

// definition of Base class 
class Base { 
public: 
    // declaration of Base::operate member function 
    // MyOperation<Base> is incomplete type here 
    MyOperation<Base> operate(Base x); 
}; 

// definition of MyOperation class template 
template<class B> 
class MyOperation : public Base{ 
public: 
    B b; 
    MyOperation(B b_){ b = b_; } 
}; 

// definition ofBase::operate member function 
inline MyOperation<Base> Base::operate(Base x) { 
    return MyOperation<Base>(x); 
} 
Base::operate

ヘッダは複数のソースファイルが含まれていれば、そうでない場合は、複数のリンカーのシンボルが存在することになる、定義はヘッダファイル内にある場合、インラインである必要があります。

インラインでない場合(大きな関数の方が良い場合)、定義はソースファイルに入れなければなりません。

+0

ありがとうございました。私はプログラミングには新しく、循環参照については考えていませんでした。 – user2440822

関連する問題