CRTP パターンでは、派生クラスの実装関数を保護されたままにしたい場合に問題が発生します。基本クラスを派生クラスのフレンドとして宣言するか、このようなものを使用する必要があります(リンクされた記事のメソッドは試していません)。派生クラスの実装関数を保護されたままにしておくことができる他の (簡単な) 方法はありますか?
編集:これは簡単なコード例です:
template<class D>
class C {
public:
void base_foo()
{
static_cast<D*>(this)->foo();
}
};
class D: public C<D> {
protected: //ERROR!
void foo() {
}
};
int main() {
D d;
d.base_foo();
return 0;
}
上記のコードはerror: ‘void D::foo()’ is protected
g++ 4.5.1 で提供されますが、protected
が に置き換えられた場合はコンパイルされpublic
ます。