web-dev-qa-db-ja.com

テンプレートのデフォルト引数

次のことが許可されている場合:

template <typename T = int>
class Foo{
};

メインで次のことができないのはなぜですか?

Foo me;

ただし、以下を指定する必要があります。

Foo<int> me;

C++ 11はデフォルトのテンプレート引数を導入しましたが、現時点では完全に理解することはできません。

127
user633658

あなたはしなければならない:

Foo<> me;

テンプレート引数は存在する必要がありますが、空のままにしておくことができます。

単一のデフォルト引数を持つ関数fooのように考えてください。式fooは呼び出しませんが、foo()は呼び出します。引数の構文はまだそこになければなりません。これはそれと一致しています。

157

C++ 17を使用すると、実際にできます。

この機能は class template argument deduction と呼ばれ、templated typesの変数を宣言できる方法に柔軟性を追加します。

そう、

template <typename T = int>
class Foo{};

int main() {
    Foo f;
}

現在は 法的C++コード です。

33
Paolo M

以下を使用できます。

Foo<> me;

そして、intをテンプレート引数にします。 angularブラケットは必須であり、省略できません。

18
Andy Prowl

あなたはそれを行うことはできませんが、あなたはこれを行うことができます

typedef Foo<> Fooo;

してから

Fooo me;
17
g24l