关于C ++模板的问题

时间:2011-02-04 05:27:38

标签: c++ templates

假设以下模板定义(代码没有意义):

template<class X, class Y>
bool FooBar(const Y& val) { return sizeof(X) + 4; }

我发现以下调用代码是合法的:

float temp = 0.f;
FooBar<int>(temp);

如您所见,可以省略第二个类型参数Y。编译器通过查看Y的参数类型来推断temp的类型。

C ++模板的规则或规范允许这样做?我很惊讶地看到它。

4 个答案:

答案 0 :(得分:5)

这是模板参数推导;它就像你使用X作为FooBar的值参数的类型一样,并且在没有任何模板参数的情况下调用它。在IBM's compiler site有一个更详细的文档。

答案 1 :(得分:3)

14.7.1第2段:

  

除非已明确实例化或明确专门化了函数模板特化,否则在需要存在函数定义的上下文中引用特化时,将隐式实例化函数模板特化。

正如耶利米指出的那样,论证演绎是你真正询问的:

14.8.2:

  

引用模板函数特化时,所有模板参数都必须具有值。可以明确指定值,或者在某些情况下,从使用中推断出值。 ...

该过程在那里有详细描述。

资料来源:ISO / IEC 14882:1998(E)

答案 2 :(得分:1)

这称为“隐式模板实例化”。参见标准,第14.7.1节。我会注意到这通常用于功能模板。

答案 3 :(得分:1)

您无需指定每个类型参数。本质上,编译器根据传入的参数类型计算出Y,并在声明中指定了X. Java和C ++之间的另一个区别。