我很惊讶,下面的代码产生了could not deduce template argument for T
错误:编译器为什么不能从默认参数中推导出模板类型?
struct foo
{
template <typename T>
void bar(int a, T b = 0.0f)
{
}
};
int main()
{
foo a;
a.bar(5);
return 0;
}
调用a.bar<float>(5)
修复该问题。为什么编译器不能从默认参数中推导出类型?
A template type-parameter cannot be deduced from the type of a function default argument.
在C++ 11:
虽然说“因为标准如此”是一个有效的答案,所以很高兴知道其背后的原因。 – 2012-03-09 04:39:16
除了其他原因,函数的不同声明可以声明不同的默认参数(我相当肯定这同样适用于函数模板。) – 2012-03-09 04:42:25
@James:不,不允许声明不同的默认参数。甚至不允许多个声明将相同的默认值赋予相同的参数。 8.3.6说:“一个默认的参数不能被后面的声明重新定义(甚至不会被重新定义)。”当然,这只适用于非模板功能。对于模板函数,它看起来像默认参数只能在初始声明中提供。 – 2013-09-03 05:03:33