Skip to content

Latest commit

 

History

History
48 lines (33 loc) · 1.58 KB

dependent_name_specifier_outside_of_templates.md

File metadata and controls

48 lines (33 loc) · 1.58 KB

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

  • cpp11[meta cpp]

このページは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
}

出力

参照