【问题标题】:How to call two overloaded functions together if they have default parameters?如果它们具有默认参数,如何一起调用两个重载函数?
【发布时间】:2021-08-14 10:08:04
【问题描述】:

我有两个具有相同名称和默认参数的函数,但是当我同时调用它们时会出错。

#include <iostream>

using namespace std;

void add(int x=2,int y=4){
    
    cout<<x+y<<endl;
}

void add(int x=2, int y=14, int z=12)
{
    cout<<x+y+z<<endl;
}


int main(){
     
    add(5,9);
    add(2,3,6);
   
    return 0;
}

【问题讨论】:

  • 应该调用哪个函数?
  • 如果你想让add(x,y)总是调用第一个重载,为什么第二个重载需要默认参数?
  • 同样的问题已经被问过enter link description here
  • 我当然不希望这些值非零。我希望结果是所有提供值的总和。如果你想实现这个,可以通过template&lt;typename ...Ts&gt; void add(Ts...args) {std::cout&lt;&lt;(args + ... + 0) &lt;&lt; '\n';}为每个变体使用不同的功能。
  • 错误是什么? (它可以帮助有相同错误的人在将来找到这个问题。)

标签: c++ overloading default-arguments


【解决方案1】:

编译器无法区分应该调用哪个函数,因为它们都匹配。您可以通过static_cast 显式选择一个重载来帮助编译器:

static_cast<void(*)(int,int)>(add)(5,9);        // calls void add(int x=2,int y=4)
static_cast<void(*)(int,int,int)>(add)(2,3,6);  // calls void add(int x=2, int y=14, int z=12)

但是,这违背了提供重载(同名但功能不同)的目的。因此,您应该更改默认值,以使调用不模棱两可。例如完全删除它们:

void add(int x,int y){
    
    cout<<x+y<<endl;
}

void add(int x, int y, int z)
{
    cout<<x+y+z<<endl;
}

【讨论】:

  • 也许应该有 2 参数版本的默认值,因为缺少 3 参数版本的默认参数永远不会有歧义:3 参数将导致调用第二个函数,小于 3 和将使用第一个功能。这将保留调用 add 并指定少于 2 个参数的可能性。
  • @fabian 也许。 OP 没有首先解释为什么会有默认值。我尽量避免它们。实际上我会考虑编写 5 个不同的重载,当函数应该用 4,3,2,1 或 0 个参数调用时
【解决方案2】:

错误告诉您add(5,9); 不明确,因为编译器无法确定您是要调用指定xy 的第一个重载还是使用xy 的第二个重载指定和z 默认为12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多