テンプレートを宣言するための構文は、template<class B>
(または同等にはtemplate<typename B>
)です。
Base
の参照MyOperation
(返品の種類と内部のoperate
の機能)もあります。したがって、をBase
より前に定義する必要があります。
しかし、MyOperation
もBase
(基本クラス)を参照してください。
基本クラスと関数内で使用するためには、完全な定義が必要です。しかし、返品タイプの場合、型が不完全です。で十分です。 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
ヘッダは複数のソースファイルが含まれていれば、そうでない場合は、複数のリンカーのシンボルが存在することになる、定義はヘッダファイル内にある場合、インラインである必要があります。
インラインでない場合(大きな関数の方が良い場合)、定義はソースファイルに入れなければなりません。
この 'テンプレート(クラスB)'は正しい構文ですか? – nbro
コンパイラはあなたにその行を表示します。一般的に、エラーに構文が記述されていると、構文が乱れてしまいます。ここで 'template(クラスB)'は 'template'でなければなりません。あなたの擬似コードかもしれません、そうでなければ、私はこれに答えを投稿します。 –
TankorSmash
'Base'は定義されているので' MyOperation'を参照できません。 –