编译错误:重载函数的多个实例与 arument 列表匹配

Compilation error: More than one instance of overloaded function matches the arument list

本文关键字:实例 arument 列表 错误 重载 函数 编译      更新时间:2023-10-16

我有一个学校作业:

i. 创建一个价格为 $150 且类型 ="古典"的古典吉他对象。将新价格设置为 $100,并显示有关吉他对象的所有信息。

ii. 创建一个价格为 $135 且类型 ="电动"的电吉他对象。在有促销时更改价格并显示有关吉他对象的所有信息。

我正在尝试自己解决它,但我是C++新手,我遇到了无法理解的编译器错误。

这是我在Guitar.h文件中创建的类。

#pragma once
#include<iostream>
#include <string>
#include<sstream>
using namespace std;
class Guitar
{
private:
string type;
double price;
public:
Guitar(string type, double price);
string getType();
double getPrice();
void setPrice(double newPrice);
void setPrice(bool promotion);
string toString();
};

这是我的吉他.cpp文件中的类实现

#include "Guitar.h"
Guitar::Guitar(string typeclass, double priceclass)
{
type = typeclass;
price = priceclass;
}
string Guitar::getType()
{
return type;
}
double Guitar::getPrice()
{
return price;
}
void Guitar::setPrice(double newPriceclass)
{
price = newPriceclass;
}
void Guitar::setPrice(bool promotion)
{
if (promotion == true)
price *= 0.9;
}
string Guitar::toString()
{
stringstream info;
info << "Guitar Type: " << type << endl
<< "Price: " << price << endl;
return info.str();
}

最后我有了我的主文件吉他应用程序.cpp

#include"Guitar.h"
int main()
{
Guitar guitar1("Classical", 150.0);
guitar1.setPrice(100) << endl;
cout << guitar1.toString() << endl;
Guitar guitar2("Electrical", 135.0);
guitar2.setPrice(true);
cout << guitar2.toString() << endl;
}

我有 2 个错误:

  1. 参数列表
    匹配的重载函数Guitar::setPrice的多个实例
  2. Guitar::setPrice对重载函数的模糊调用。

有人可以向我解释错误以及我应该怎么做才能编译代码吗?

编辑:100更改为100.0后,我又遇到了4个错误:

  1. 形式参数列表
    不匹配
  2. 表达式必须具有整型或无作用域枚举类型
  3. 无法确定std::endl的函数模板的哪个实例 ;
  4. "<<":无法解决函数过载问题

所有错误都在我的吉他应用程序的第 7 行.cpp即

guitar1.setprice(100.0)<<endl;

如果我将吉他的价格从100.0编辑回100,我会得到我最初遇到的两个错误。

文字100的类型是int。由于int就像double一样容易转换为bool,因此应该调用哪些函数是模棱两可的。

100更改为100.0(double文字)应该可以解决此问题。

通常我们不会在这里修复家庭作品。最好问"为什么这行代码不起作用",而不是在这里扔一堆作业,希望从其他人那里准备好它......

还请记住,您的问题是"题外话",因为:

寻求调试帮助的问题("为什么此代码不起作用?")必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用。

好的,您的代码有以下语法错误:

guitar1.setPrice(100.) ; // see the "." behind the number!

你必须方法:

void setPrice(double newPrice);
void setPrice(bool promotion);

你写道:

guitar1.setPrice(100)  

100int,不是double,也不是bool.因此,编译器不能决定从您的 100 个中制作具有值truebool或使其成为具有值100.double。因此,只需添加一个点即可使您的值成为浮点值,编译器将其视为double

下一个错误:

cout << guitar2.toString() << endl;  // see the "2" behind guitar !

只是一个错别字...

一些评论:

在标头和源文件中拆分这样的类是不好的!优化程序没有机会内联函数。

使用using namespace std;可能很糟糕!最好写 std::string,你需要看到你的定义来自哪个命名空间。这需要更多的工作,但以后阅读要好得多,特别是如果您使用来自多个库的多个命名空间。

解释:

在第一次查看时很容易保存键入一些字符。但是,如果您稍后(重新)在更大的应用程序中(重新)使用您的代码,您必须处理许多库,这些库可能定义函数/类/与其他库之一同名的内容,您开始更改代码。

一个简单的例子是让 posix 读取和 istream 读取就地。在这里,给出一个"::read"来选择未绑定到命名空间的posix也是一个好主意。

给出不使用using namespace的提示是教条吗?我的个人经验很简单,如果你使用它,如果你的代码以后在更大的应用程序中(重新)使用,你可能会遇到问题。对我来说,必须这样编写我的代码,可以(重新)使用而不会出现问题,或者将来会有很多采用/更正。

您必须决定:保存一些字符以在今天键入,以后可能会遇到麻烦或立即完成工作。

也许对于家庭作业代码可以这样做。但我认为谈论这种代码编写中可能出现的问题是一个很好的观点。