【问题标题】:Compilation error: More than one instance of overloaded function matches the arument list [closed]编译错误:多个重载函数实例与参数列表匹配[关闭]
【发布时间】:2016-11-27 09:05:25
【问题描述】:

我有一个学校作业:

我。创建一个价格为 150 美元和 type = “classical” 的古典吉他对象。将新价格设置为 100 美元并显示有关吉他对象的所有信息。

二。创建一个价格为 135 美元的电吉他对象,类型为“electric”。在促销时更改价格并显示有关吉他对象的所有信息。

我正在尝试自己解决它,但我是 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();
};

这是我的 Guitar.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();
}

终于有了我的主文件GuitarApp.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. '

所有错误都在我的 GuitarApp.cpp 的第 7 行,即

guitar1.setprice(100.0)<<endl;

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

【问题讨论】:

  • 将 100 更改为 100.0。其他四个错误是什么?
  • 您的编译器肯定会告诉错误的行号;你能完成吗?对了,现在少了一个 cout(因为你之前没有 endl 错误)
  • @Christophe 所有错误都在我的 GuitarApp.cpp 的第 7 行,即 guitar1.setprice(100.0)
  • @Kris 添加 cout
  • @kris 第 7 行。如果没有 cout,

标签: c++ class overloading


【解决方案1】:

文字100 的类型是int。由于intbool 一样容易转换为double,因此应该调用哪些函数是不明确的。

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

【讨论】:

  • 是的!出于这个原因,甚至可以建议使用另一个函数名称来激活促销,例如promote() 或setPromotion()
  • 没错,真正的解决方案是更好地命名函数
【解决方案2】:

通常我们不会在这里修复家庭作业。最好问“为什么这行代码不起作用”,而不是在这里扔一堆功课,希望从别人那里得到准备......

请记住,您的问题是“离题”,因为:

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

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

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

你必须要方法:

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

你写道:

 guitar1.setPrice(100)  

100int 而不是 double 而不是 bool。所以编译器不能决定从你的 100 中创建一个 bool,它的值是 true,或者是 double,它的值是 100.。因此,只需添加一个点即可使您的值成为浮点值,编译器会将其视为double

下一个错误:

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

只是一个错字...

一些备注:

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

使用using namespace std; 可能很糟糕!最好写 std::string 和所有你需要看到你的定义来自哪个命名空间。这会增加一些工作量,但以后阅读起来会更好,尤其是当您使用来自多个库的多个命名空间时。

解释:

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

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

提示不使用using namespace 是否教条?我个人的经验很简单,如果您使用它,如果您的代码稍后在更大的应用程序中(重新)使用,您可能会遇到问题。而对于 me 来说,我的代码必须这样编写, 可以毫无问题地(重新)使用,或者在未来进行大量采用/更正。 p>

您必须做出决定:保存一些字符以便今天输入,以后可能会遇到麻烦,或者现在就开始工作。

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

【讨论】:

  • “使用 using namespace std; 很糟糕!”。不是教条式的坏。只是在某种程度上污染了全局命名空间。如果命名空间被大量引用,那么在函数范围内执行它并没有错。
  • 你还在教条主义。如果您有名称冲突,您总是可以消除歧义。我建议您考虑一下您喜欢阅读的内容:v.erase(std::remove(std::begin(v), std::end(v), elem));v.erase(remove(begin(a), end(a), elem));(为了争论,我们忽略 ADL)。
  • @StoryTeller:我会澄清一点,但是是的,对我来说这是“不好的做法”。但也可以,每个人都可以做他/她想做的事,但付出的代价比你可能拥有的储蓄要高。
  • 您不能先验地要求“价格”。命名空间很好,我们都应该使用它们。但是,如果我的使用单个库的 2 行函数可以在第一行使用单个 using namespace std; 变得更具可读性,那么您可以打赌我会这样做。以及许多其他人。编程中没有教条。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多