2012-04-10 12 views
2

なぜ派生クラスは、そのテンプレートベースの保護された基底クラスメンバにアクセスする権限がありませんか?基本クラスとしてのC++テンプレートparam

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 

答えて

11

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

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

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

をC++ 2003の標準、11.5/1 [class.protected]から:「友人や派生クラスのメンバ関数は、保護された非静的メンバ関数または 保護された非静的データメンバを参照します基底クラスのアクセスは、派生クラス自体(またはそのクラスから派生したクラス)へのポインタ、参照先、オブジェクトのいずれかでなければなりません "

+0

...または' return Impl :: foo; ' 。 –

+0

またはreturn foo; //私のコメントを長くして、stackoverflowが私にそれを投稿させるようにするための不要なコメント。 –

+2

'return foo;'は間違いなく動作しません。 –

関連する問題