x
ご存知のように、メンバーが依存基底クラスにあるため、以下のコードは形式が正しくありません。ただし、指定された行に変更x
するthis->x
とエラーが修正されます。
template <typename T>
struct B {
int x;
};
template <typename T>
struct C : B<T> {
void f() {
int y = x; // Error!
}
};
int main() {
C<int> c;
c.f();
}
この動作が標準でどのように指定されているかについて説明をお願いします。[temp.dep]/3 によると:
クラスまたはクラス テンプレートの定義で、基本クラスがテンプレート パラメーターに依存している場合、クラス テンプレートまたはメンバーの定義時点での非修飾名ルックアップ中、またはクラス テンプレートまたはクラス テンプレートのインスタンス化中のいずれかで、基本クラス スコープは検査されません。クラス テンプレートまたはメンバー。
x
これは、単独で使用すると失敗する理由を説明しているようです。名前x
は定義の時点で調べられ、基本クラスのスコープは調べられません。しかし、 を使用するとどうなるthis->x
でしょうか? 現在、名前x
は依存しており、そのルックアップはインスタンス化まで延期されています。しかし、引用されたパラグラフは、 inのルックアップがまだ修飾されていないルックアップであるため、インスタンス化の時点でもそれをx
見つけてはならないことを暗示しているようです。x
this->x
実装がこのように動作しないことは明らかであり、テンプレートがインスタンス化されると基本クラスのスコープが検索されることは広く理解されています。
- 引用された段落を誤解しましたか?
- 「正しい」動作を指定する段落はありますか?