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のケースをカバーしていませんが、少なくとも同じことを証明するために、テンプレートは依然としてテンプレート(クラスまたは関数)として識別されるように角括弧<>
を必要とします。
あなたがそれを指定する必要はありません: 'A <>; W.F @' –
。興味深い、あなたはなぜ知っていますか? – imreal
同様に、カッコを入れずにデフォルトの引数で関数を呼び出すことはできません。 –