默认模板参数:为什么编译器会抱怨没有指定模板参数?

时间:2012-06-27 16:57:48

标签: c++ templates default-parameters template-deduction

我有这段代码:

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()

那么为什么我需要为带有默认参数的模板类指定参数,而不是为模板函数指定?我遗失了一些微妙之处吗?

原因是因为模板参数扣除失败肯定。但我想知道原因。

3 个答案:

答案 0 :(得分:7)

正确的语法是这个(demo):

B<> b; 

假定类模板A的默认参数B<>部分告诉编译器B是一个类模板,并要求它将默认参数作为模板参数。

答案 1 :(得分:1)

Nawaz提到的正确语法是:

B<> b;

原因是B是模板,B<>是模板的实例化,默认参数为A。但是,当需要实例化时,需要<>来区分。

答案 2 :(得分:0)

因为你必须说B是一个模板:

B<> b;

即使您不想指定任何参数。