ここでは、「typename D」で定義された var が修飾されていない依存名であることをテストして確認します。答えはイエスです。その定義を2回書いた場合:
template<typename D>
class A {
D d_field;
D d_field;
void func() { d_field = 1000; }
}
int main()
{
return 0;
}
g++ は再定義エラーを報告します。テンプレート定義で「d_field」がチェックされていることを示しています。
そして、このテンプレートを使用するためにタイプ「double*」を指定した場合。テンプレートのインスタンス化が行われ、func2 で "int を double* に変換できません" というエラーが報告されます。
template<typename D>
class A {
D d_field;
void func() { d_field = 1000; }
}
int main()
{
A<double*> a;
a.func();
return 0;
}
テンプレートのインスタンス化で「d_field」がチェックされることを証明します。
さらに、以下のように変更すると、g++ は正常にコンパイルされます。gcc が c++ 標準に基づく 2 フェーズ ルックアップで機能することを証明します...名前が修飾された依存名である場合、テンプレートのインスタンス化でのみチェックされます。 .
template<typename D>
class A {
D:: d_field;
D:: d_field;
void func() { d_field = 1000; }
}
int main()
{
return 0;
}
つまり、テンプレート パラメーターを使用してテンプレート内の変数を定義します。変数の名前は修飾されていない従属名です。
それは正しいですか?