10

我有这个代码:

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

那么为什么我需要为具有默认参数的模板类指定参数,而不是为模板函数指定参数呢?我缺少一些微妙之处吗?

原因肯定是模板参数推导失败。但我想知道为什么。

4

3 回答 3

7

正确的语法是这样的(演示):

B<> b; 

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

于 2012-06-27T17:01:25.443 回答
1

正如 Nawaz 已经提到的,正确的语法是:

B<> b;

原因是它B是模板,并且B<>是带有默认参数的模板的实例化A。但是<>当您需要实例化时,您需要区分。

于 2012-06-27T17:05:13.763 回答
0

因为你不得不说那B是一个模板:

B<> b;

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

于 2012-06-27T17:02:34.557 回答