我有这段代码:
struct A{};
template<class T = A>
struct B {
void foo() {}
};
B b; //Error: missing template arguments before 'b'
//Error: expected ';' before 'b'
//More errors
b.foo()
如果我将foo()
作为具有相同模板“签名”的模板函数,编译器不会抱怨没有指定模板参数:
struct A {};
struct B {
template<class T = A>
void foo() {}
};
B b; //OK
b.foo()
那么为什么我需要为带有默认参数的模板类指定参数,而不是为模板函数指定?我遗失了一些微妙之处吗?
原因是因为模板参数扣除失败肯定。但我想知道原因。
答案 0 :(得分:7)
答案 1 :(得分:1)
Nawaz提到的正确语法是:
B<> b;
原因是B
是模板,B<>
是模板的实例化,默认参数为A
。但是,当需要实例化时,需要<>
来区分。
答案 2 :(得分:0)
因为你必须说B
是一个模板:
B<> b;
即使您不想指定任何参数。