-5

ここでは、「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;
 }

つまり、テンプレート パラメーターを使用してテンプレート内の変数を定義します。変数の名前は修飾されていない従属名です。

それは正しいですか?

4

1 に答える 1

2

いいえ。変数の名前はローカルで宣言された名前であるため、依存でも非依存でもありません。コンパイラがテンプレートの外部で検索する必要がある名前のみが、依存または非依存になります。

于 2013-01-29T14:08:23.527 に答える