函数调用中的错误

时间:2018-08-13 17:11:14

标签: c++

  

编写一个函数NumberOfPennies(),该函数在给定一定数量的美元和(可选)一定数量的便士的情况下,返回总的便士数量。例如:5美元和6便士可得到506。

对于上述问题,这是下面的代码。 收到错误消息:error: no matching function for call to 'NumberOfPennies(int)'

#include <iostream>
using namespace std;

int NumberOfPennies(int one,int two)
{
 return (one*100+two);
}

int main() {
cout << NumberOfPennies(5, 6) << endl; // Should print 506
cout << NumberOfPennies(4) << endl;    // Should print 400
return 0;
}

但是,当我将int two=0放到函数NumberOfPennies中时,它正在工作。为什么会这样呢?谁能解释一下。

#include <iostream>
using namespace std;

int NumberOfPennies(int one,int two=0)
{
 return (one*100+two);
}

int main() {
cout << NumberOfPennies(5, 6) << endl; // Should print 506
cout << NumberOfPennies(4) << endl;    // Should print 400
return 0;
}

3 个答案:

答案 0 :(得分:3)

您在第二个代码段中写了int two = 0的事实是您支持参数two默认值为0。

这意味着可以在呼叫站点将其省略,并假设使用默认值,因此

cout << NumberOfPennies(4) << endl;

cout << NumberOfPennies(4, 0) << endl;

是等效的。如果不对函数进行编码以支持默认值,则需要使用两个参数来调用NumberOfPennies

(为了提高可读性,请考虑将参数onetwo分别重命名为dollarscents)。

答案 1 :(得分:1)

在C ++中有一个称为默认参数的概念。查找此链接https://www.programiz.com/cpp-programming/default-argument

在第一种情况下,它无法将函数调用解析为仅采用一个整数参数的任何现有函数调用,并且失败。 int NumberOfPennies(int one,int two)

在第二种情况下,我们已经提到int NumberOfPennies(int one,int two=0),如果未传递第二个整数,则假定默认值为0。在第一次运行时,编译器无法找到需要只是一个整数参数。接下来,它查找可能的情况,其中您的函数具有2个整数输入,其中一个具有默认值。您的函数符合这种情况,因此编译成功。

(其他信息:编写直观的函数名和参数会很有帮助。建议您将参数重命名为int NumberOfPennies(int dollars,int cents)

答案 2 :(得分:0)

  

“我运行了下面的代码,但是它不起作用”

不是对问题的有用描述。

  

为什么会这样?谁能解释一下。

您的问题在编译器错误报告中得到了明确说明,您应该在自己的帖子中列出。

error: no matching function for call to ‘NumberOfPennies(int)’
          std::cout << NumberOfPennies(4)   << std::endl;
                                       ^
note: candidate: int NumberOfPennies(int, int)
    int NumberOfPennies(int one, int two)
        ^~~~~~~~~~~~~~~
note:   candidate expects 2 arguments, 1 provided

因此,当声明需要2时,您尝试使用1个参数调用该函数。

通过添加第二个参数的默认值

int NumberOfPennies(int one,int two=0) ...

未提供第二个参数的值。

查看默认功能参数。