まず、C++ 標準 (ISO/IEC 14882:2003): Section 11.5, Paragraph 1について知っていますが、これはそうではありません (ただし、コンパイラは明らかにそうではないと考えています)。
このポインターを介して派生クラス メソッドで保護された基本クラス メソッドを呼び出そうとし、基本クラスポインターに静的キャストされ、MSVC2008エラー C2248: 'A::f' : cannot access protected member defined in class 'A' が発生しました。
「不思議なことに繰り返されるテンプレートパターン」のコンテキストでこれを行う必要がありますが、次のように、より単純なコードでこのエラーを再現できます。
class B
{
protected:
void f(){}
};
class D : public B
{
public:
void g()
{
f(); // ok
this->f(); // ok
static_cast<B*>(this)->f(); // C2248 in MSVC2008
dynamic_cast<B*>(this)->f(); // C2248
((B*)this)->f(); // C2248
}
};
D d; d.g();
コンパイラは、このポインターを他のインスタンスへのポインターとしてキャストしたと考えているようです。
この場合、コンパイラは間違っています。どう思いますか?
わかりました、私の実際のコードはもっと似ています:
template<class T>
class B
{
public:
void g()
{
f(); // error C3861: 'f': identifier not found
this->f(); // error C3861: 'f': identifier not found
// static_cast to derived class
static_cast<T*>(this)->f(); // C2248 in MSVC2008
}
};
class D : public B<D>
{
protected:
void f(){}
};
これを派生クラスにキャストしましたが、 this->f();を使用できません。
ちなみに、このコードはclass E : public B<D> {...};
: コンパイル可能ですが、static_cast のキャストが間違っています。