2

テンプレート化されたときに、派生クラスが保護された基本クラスメンバーにアクセスすることを許可されていないのはなぜですか?

class MyBase {
protected:
    int foo;
};

template<typename Impl>
class Derived : public Impl {
public:
    int getfoo() {
            return static_cast<Impl*>(this)->foo;
    }
};

コンパイラはfooが保護されていると文句を言います。なぜ?

error: int MyBase::foo is protected
4

1 に答える 1

11

の代わりにをfoo介してアクセスしています。保護されたメンバーにアクセスできるのは、基本タイプではなく、独自のタイプのみです。MyBase*Derived<MyBase>*

代わりにこれを試してください:

int getfoo() {
        return this->foo;
}

C ++ 2003標準、11.5 / 1から[class.protected]: "派生クラスのフレンドまたはメンバー関数が基本クラスの保護された非静的メンバー関数または保護された非静的データメンバーを参照する場合…アクセスは、へのポインター、への参照を介して行う必要があります。または派生クラス自体(またはそのクラスから派生したクラス)のオブジェクト」

于 2012-04-10T20:02:17.677 に答える