【问题标题】:Default parameter and templates默认参数和模板
【发布时间】:2013-10-20 22:50:22
【问题描述】:
为什么这个函数给我一个错误:
template < typename T >
T foo( T s = 0, const vector < T > &v)
{
...
}
错误:'template summable sum(summable, const std::vector&)'的参数2缺少默认参数
为什么没有以下内容?:
template < typename T >
T foo( const vector < T > &v, T s = 0)
{
...
}
【问题讨论】:
标签:
c++
templates
default-value
【解决方案1】:
可选参数必须是最后一个。 IE。非可选参数不能跟在可选参数之后。
你会怎么称呼
T foo( T s = 0, const vector < T > &v)
只有v,没有s?
如果
,编译器将如何发现这一点
-
s 和 v 具有相同的类型,或者
-
foo 的过载仅占用了const vector<T>&?
【解决方案2】:
如果参数有默认值,那么后面的所有参数也需要有默认值。
基本原理在其他答案中给出,所以我给你引用 C++11 标准:
8.3.6 默认参数 [dcl.fct.default]
4 (...) 在给定的函数声明中,每个参数跟在一个
带有默认参数的参数应该有一个默认参数
在本声明或先前声明中提供或应为函数
参数包。
【解决方案3】:
具有默认值的参数必须是最后一个参数。首先,您有 s 的默认值为 0,然后 v 没有默认值。你不能在一个有默认值的参数之后再有一个没有默认值的参数。
您将如何使用其默认值调用诸如参数? foo(/*default*/,vector)?