【问题标题】: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

如果

,编译器将如何发现这一点
  • sv 具有相同的类型,或者
  • foo 的过载仅占用了const vector&lt;T&gt;&amp;

【讨论】:

  • 谢谢,非常好的回答!
【解决方案2】:

如果参数有默认值,那么后面的所有参数也需要有默认值。

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

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

4 (...) 在给定的函数声明中,每个参数跟在一个 带有默认参数的参数应该有一个默认参数 在本声明或先前声明中提供或应为函数 参数包。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-16
      • 2021-12-27
      • 2013-10-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多