• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    依存名に対するtypenameとtemplateの制限緩和

    このページはC++11に採用された言語機能の変更を解説しています。

    のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

    概要

    テンプレート内で、テンプレートパラメータに依存する名前を使用する場合には、typenameキーワードを先頭に付ける必要がある。

    テンプレート内で、推論できないテンプレートパラメータを持つメンバ関数を呼び出す場合には、メンバ関数名の前にtemplateキーワードを付ける必要がある。

    C++03まで、テンプレート外でtypenametemplateを付けるとコンパイルエラーになっていたが、C++11では、テンプレート外でtypenametemplateを付けることが許可された。

    これは、テンプレート内とテンプレート外で、共通のコードを利用できるようにするためである。

    #include <vector>
    
    struct X {
      template <int N>
      int get() const
      {
          return N;
      }
    };
    
    int main()
    {
      typename std::vector<int>::iterator it; // OK
    
      int value = X().template get<3>(); // OK
    }
    

    出力

    参照