3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

テンプレートテンプレート仮引数が読めなく困った。

Last updated at Posted at 2020-07-20

普段はJavaを書いているのですが、ちょっとした用事でC++を読むことになり
その途中でテンプレートテンプレート仮引数が読めなくて躓いたので自分用のメモを作成します。

下のようなコードがあった時クラスAがテンプレートテンプレート仮引数を持つ。

template<template<class U> class T>
class A{
  public:
    A(){
    }   
};

このクラスが表現したい事は単純で、ただ単にAを生成する時のTは
テンプレート引数を1つ持つクラスしか渡せませんということらしい。
(これに辿り着くまで、かなり悩んだ)

なので使い方としては以下のようになる。

#include <string>

template<template<class U> class T>
class A{
  public:
    A(){
    }   
};

template<class T>
class B{
  public:
    B(){
    }   
};

int main(){
  A<B> a0; //この行はコンパイル出来る
  
  //A<std::string> a1; //この行はコンパイル出来ない
}

この時、クラスAにたいしてstd::vectorをパラメタとして渡せなくて躓いた。
もしstd::vectorを渡せるクラスAを書きたい場合下記のように書く必要がある。

template<template<class U,class V> class T>
class A{
  public:
    A(){
    }   
};

追記

コメント頂いて知ったのですが、g++だと-std=c++17をつけると
冒頭のAクラスのままでもstd::vectorを実パラメタとして渡せるようです。

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?