派生クラスのクラスの保護されたメンバーにアクセスする
-
06-07-2019 - |
質問
iには古いコードベースがあり、保護されたメンバー変数を使用していました。これが良いアイデアであるかどうかを議論することができます。ただし、コードはgcc3で正常にコンパイルされている必要があります。 クラステンプレートFooの保護されたメンバーxを使用する派生テンプレートクラスBarがあります
template <class Something> class Foo {
public:
// stuff...
protected:
some::type x;
}
template <class Something> Bar : Foo<Something> {
public:
void cleanup();
}
そして、cleanup()のメソッド宣言には、xで行われたものがあります
template <class Something> void Bar<Something>::cleanup() {
doSomeThingCleanUpLike (x);
}
これはgcc4では機能しませんが、gcc3では機能するはずです。変更すると機能します
doSomeThingCleanUpLike (this->x);
なぜそうなのですか?
解決
派生クラスで使用される式 x
は、標準の規則により、派生クラスのテンプレートパラメーターに依存しません。このため、ルックアップは、使用/インスタンス化の時点ではなく、テンプレート定義のコンテキストで発生します。テンプレートのテンプレート基本クラスは表示されているように見えますが、それはテンプレートクラスであるため、使用される可能性のある特定のインスタンス化には特殊なテンプレートが含まれる可能性があり、名前検索に基本クラステンプレート定義を使用できません。
式を this-&gt; x
に変更することにより、それを依存式にします(クラステンプレートの this
は常にテンプレートパラメータに依存します)。これは、基本クラスが完全に認識され、そのメンバーが表示される時点でインスタンス化コンテキストでルックアップが発生することを意味します。
他のヒント
派生テンプレートを定義する場合、コンパイラは基本テンプレートクラスの名前のみを知っており、その詳細は知らないため、コンパイラは派生クラスに継承されたメンバーがあることを知りません。コンパイラーにメンバーの存在を知らせるには、 this-&gt;
を使用してください。
実際には、この質問の複製です。