9

ここに古いコードベースがあり、保護されたメンバー変数を使用していました。これが良いアイデアであるかどうかは、議論することができます。ただし、コードは 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);
}

これは、gcc3 では機能するはずでしたが、gcc4 では機能しません。に変更すると動作します

doSomeThingCleanUpLike (this->x);

なぜそうなのですか?

4

2 に答える 2

14

派生クラスで使用される式xは、標準の規則により、派生クラスのテンプレート パラメーターに依存しません。このため、ルックアップはテンプレート定義のコンテキストで発生し、使用/インスタンス化の時点では発生しません。テンプレートのテンプレート基本クラスは表示されているように見えますが、それはテンプレート クラスであるため、使用される可能性のある特定のインスタンス化には特殊なテンプレートが含まれる可能性があるため、基本クラスのテンプレート定義を名前検索に使用することはできません。

式を変更するthis->xことで、依存式になります (thisクラス テンプレートでは、常にテンプレート パラメーターに依存します)。これは、基本クラスが完全に認識され、そのメンバーが表示される時点で、インスタンス化コンテキストで検索が行われることを意味します。

于 2009-10-26T13:06:47.453 に答える
6

派生テンプレートを定義する場合、コンパイラは基本テンプレートクラスの名前のみを認識し、その詳細は認識しないため、コンパイラは派生クラスに継承されたメンバーがあることを認識しません。メンバーの存在をコンパイラーに通知するにはthis->、同じようにを使用します。

実際、これはこの質問の複製です。

于 2009-10-26T12:56:08.660 に答える