次のことを許可されている場合:
template <typename T = int>
class Foo{
};
なぜメインで以下を行うことが許可されていないのですか?
Foo me;
ただし、以下を指定する必要があります。
Foo<int> me;
C ++ 11はデフォルトのテンプレート引数を導入し、現在、それらは私の完全な理解にとらわれています。
次のことを許可されている場合:
template <typename T = int>
class Foo{
};
なぜメインで以下を行うことが許可されていないのですか?
Foo me;
ただし、以下を指定する必要があります。
Foo<int> me;
C ++ 11はデフォルトのテンプレート引数を導入し、現在、それらは私の完全な理解にとらわれています。
回答:
あなたはしなければならない:
Foo<> me;
テンプレート引数は存在している必要がありますが、空のままにすることができます。
それをfoo
単一のデフォルト引数を持つ関数のように考えてください。式foo
はそれを呼び出さないでしょうが、呼び出しfoo()
ます。引数の構文はまだ存在している必要があります。これはそれと一致しています。
foo
でも、引数なしで関数を呼び出すことはできません。Foo
ただし、引数なしでクラスに名前を付けることができます。
<>
この場合はもう必要ありません。詳細については、私の答えを確認してください。
C ++ 17を使用すると、確かにできます。
この機能はクラステンプレート引数の推定と呼ばれ、テンプレート化された型の変数を宣言する方法に柔軟性を追加します。
そう、
template <typename T = int>
class Foo{};
int main() {
Foo f;
}
は現在、正当なC ++コードです。
あなたはそれをすることはできませんが、あなたはこれを行うことができます
typedef Foo<> Fooo;
そして次に
Fooo me;
typedef Foo<float> Fooo;
ますか?:デフォルトのタイプなしで?
using Fooo = Foo<>;
次のものを使用できます。
Foo<> me;
そしてint
、あなたのテンプレートの引数があります。山括弧は必須であり、省略できません。
Foo
かもしれないテンプレート識別子であるか、またはかもしれないデフォルトの引数がありますかどうかに応じて明示的にインスタンス化すること。明示的なインスタンス化構文を保持することをお勧めします。foo
単一のデフォルトパラメータを持つ関数のように考えてください。のようfoo
に呼び出すことはできませんfoo()
。これを一貫して維持することは理にかなっています。