2013-03-12 22 views
83

Iは、次の操作を実行させて頂く場合:テンプレートのデフォルト引数

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

は、なぜ私がメインで、次の操作を行うことは許されないのですか?

Foo me; 

しかし、私は次のように指定する必要があります。

Foo<int> me; 

C++ 11には、デフォルトのテンプレート引数を導入し、今、彼らは私の完全な理解のために、とらえどころのないされています。

+2

を行うことができます、しかし、Googleは(いくつかのために...ここで例えば私は私をもたらしました)C++ 11と11以前の区別は非常に重要です。私の知る限りでは、デフォルトのテンプレート引数はすでにC++ 11より前に存在していました。 – user463035818

答えて

105

あなたがしなければならない。

Foo<> me; 

テンプレート引数が存在する必要がありますが、あなたは空にそれらを残すことができます。

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

+12

私はいつも '<>'がなぜ必要なのか疑問に思っています。何か案が? – Pubby

+4

@Pubby 'Foo' *がテンプレート識別子であるかもしれないか、デフォルトの引数があるかどうかによって明示的なインスタンス化かもしれないなら、いくつかの不必要な複雑化を引き起こすでしょう。明示的なインスタンス化構文を保つ方が良い。単一のデフォルトパラメータを持つ関数 'foo'のように考えてください。 'foo'のように呼び出すことはできません。あなたは' foo() 'で呼びます。これは一貫性を保つのが理にかなっています。 –

+14

一方、 'foo()' *は 'foo()' ...と短縮することができます。 – aschepler

16

次を使用することができます。

Foo<> me; 

そして、あなたのテンプレート引数もint持っています。山括弧は必須で省略することはできません。

+0

感謝してありがとうございますが、下記のように、タイプ指定はなぜ存在しないのですか? – user633658

+0

@ user633658:「型指定子」を意味しましたか?私は理解していないと確信していません –

+0

とにかく、空の角かっこが必要な理由については、私は推測しかできません。テンプレートの名前だけを使用して、あいまいさを排除することができます。私が正確な理由を知らないと告白します。 –

15

あなたはそれを行うことは許されませんが、あなたがこの

typedef Foo<> Fooo; 

を行い、その後、すでにかなり古い質問

Fooo me; 
+0

これには、デフォルトの型と: 'typedef Foo Fooo;'との違いはありますか? – qrikko

関連する問題