最終更新日時(UTC): 2025年07月10日 01時26分30秒
Koichi Murase が更新

履歴 編集

# テンプレートテンプレートパラメータにtypenameキーワードの使用を許可 [N4051](C++17)

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

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

## 概要

テンプレートパラメータはほとんどの箇所で`class`キーワードと`typename`キーワードの両方を使用できたが、テンプレートテンプレートパラメータのクラステンプレート部分については`class`キーワードしか使用できなかった。

    // `class X`部分については、typenameを使用できなかった
    template <template <typename... Args> class X>
    class Y;

C++17では、テンプレートテンプレートパラメータでも`typename`キーワードを使用できることとなった。

    // `typename X`と書けるようになった
    template <template <typename... Args> typename X>
    class Y;

## 例

    #include <vector>

    template <template <typename...> typename Container>
    class X {
      // コンテナのクラステンプレートをテンプレートパラメータで受け取って、
      // 要素型はあとで指定する。
      Container<int> c_;
    public:
      void add(int x)
      {
        c_.push_back(x);
      }
    };

    int main()
    {
      X<std::vector> x;
      x.add(3);
      x.add(1);
      x.add(4);
    }

## 参照

- N4051 Allow `typename` in a template template parameter