質問

いくつかのフィールドを保護した BassClass などの基本クラスと、いくつかの純粋な仮想関数があります。次に、 class DerivedClass:public BassClass のような派生クラス、たとえば DerivedClass を作成します。 DerivedClassは、BassClassから保護フィールドを継承すべきではありませんか? DerivedClassをコンパイルしようとすると、コンパイラは、DerivedClassにこれらのフィールドが含まれていないと文句を言いますが、ここで何が間違っていますか? ありがとう

役に立ちましたか?

解決

BassClass (sic)および DerivedClass がテンプレートであり、 DerivedClass からアクセスする BassClass メンバー>依存名として指定されていないため、表示されません。

E.g。

template <typename T> class BaseClass {
protected: 
    int value;
};

template <typename T> class DerivedClass : public BaseClass<T> {
public:
    int get_value() {return value;} // ERROR: value is not a dependent name
};

アクセスするには、さらに情報を提供する必要があります。たとえば、メンバーの名前を完全に指定できます。

    int get_value() {return BaseClass<T>::value;}

または、クラスメンバーを参照していることを明示することもできます。

    int get_value() {return this->value;}

他のヒント

これは動作します:

#include <iostream>

struct Base {
virtual void print () const = 0;
protected:
int val;
};

struct Derived : Base {
void print () { std::cout << "Bases's val: " << val << std::endl; }
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top