2017-09-18 13 views
2

これは本当に私が驚きとして私に来たので、私はここで何かを明らかにしていなければなりません。デフォルト値で宣言された1つのパラメータを持つテンプレートがそれに値を指定するインスタンス化する必要がある理由がありますerror: missing template arguments before ‘a’1つのパラメータとデフォルト値を持つクラステンプレート

template<int n=0> 
class A {}; 

... 
A a; 
... 

次のコードは私にエラーを与えて?

誰かが標準を引用できますか?

+5

あなたがそれを指定する必要はありません: 'A <>; W.F @' –

+0

。興味深い、あなたはなぜ知っていますか? – imreal

+0

同様に、カッコを入れずにデフォルトの引数で関数を呼び出すことはできません。 –

答えて

5

Aはまだテンプレートクラスです。しかし、あなたはかかわらず、テンプレートパラメータを省略することができます。

template<int n=0> 
class A {}; 

int main() { 
    A<> a; 
    // ^^ 
    return 0; 
} 

live demoを参照してください。私は関連standard sectionがここ

14.7 Template instantiation and specialization

...
3 An explicit specialization may be declared for a function template, a class template, a member of a class template or a member template. An explicit specialization declaration is introduced by template<>. In an explicit specialization declaration for a class template, a member of a class template or a class member template, the name of the class that is explicitly specialized shall be a simple-template-id. In the explicit specialization declaration for a function template or a member function template, the name of the function or member function explicitly specialized may be a template-id.
[Example:

template<class T = int> struct A { 
    static int x; 
}; 
template<class U> void g(U) { } 
template<> struct A<double> { }; // specialize for T == double 
template<> struct A<> { }; // specialize for T == int 
template<> void g(char) { } // specialize for U == char 
// U is deduced from the parameter type 
template<> void g<int>(int) { } // specialize for U == int 
template<> int A<char>::x = 0; // specialize for T == char 
template<class T = int> struct B { 
    static int x; 
}; 
template<> int B<>::x = 1; // specialize for T == int 

— end example ]


1)で申し訳ありませんが、私はより良い標準を見つけることができないと思います


は/例を引用します。それは正確にOPのケースをカバーしていませんが、少なくとも同じことを証明するために、テンプレートは依然としてテンプレート(クラスまたは関数)として識別されるように角括弧<>を必要とします。

+0

この規格のこのセクションでは、テンプレートの特化について詳しく説明します。テンプレートのインスタンス化についてはここでは何も表示されません。 – cdhowie

+0

@cdhowieええ、私はまだ関連部分を探しています: - P ... – user0042

+0

@cdhowie私は検索を断念しました。より良い引用/例が見つかりませんでした。 – user0042

3

可能な回避策、それはあなたのオブジェクトの性質を偽装することが重要です場合:

// the template class 
template<int n=0> 
class ReallyA {}; 

// an alias for the common case  
using A = ReallyA<0>; 

A a; 

これは、標準ライブラリは、例えば、std::stringを定義する方法です。

using string = basic_string<char>; 
関連する問題