1

为什么这个函数给我一个错误:

template < typename T >
T foo( T s = 0, const vector < T > &v)
{
    ...
}

错误:'template summable sum(summable, const std::vector&)'的参数 2 缺少默认参数</p>

为什么不以下?:

template < typename T >
T foo( const vector < T > &v, T s = 0)
{
    ...
}
4

3 回答 3

5

可选参数必须是最后一个。即非可选参数不能跟随可选参数。

你会怎么称呼

T foo( T s = 0, const vector < T > &v)

只有一个v没有s

如果编译器如何发现这一点

  • s并且v具有相同的类型,或
  • foo服用一个const vector<T>&
于 2013-10-20T22:56:01.823 回答
2

如果参数具有默认值,则所有后续参数也需要具有默认值。

基本原理在其他答案中给出,所以我会给你一个 C++11 标准的引用:

8.3.6 默认参数 [dcl.fct.default]

4 (...) 在给定的函数声明中,带有默认实参的形参之后的每个形参都应具有在此声明或先前声明中提供的默认实参,或者应为函数形参包。

于 2013-10-20T22:56:05.340 回答
0

具有默认值的参数必须是最后一个参数。首先,您有 s 的默认值为 0,然后 v 没有默认值。你不能在一个有默认值的参数之后有一个没有默认值的参数。

您将如何使用其默认值调用诸如参数?foo(/*default*/,vector)?

于 2013-10-20T22:56:53.600 回答