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

时间:2016-11-27 09:05:26

标签: c++ class overloading

我有一份上学的任务:

  

我。创建价格为150美元且类型为“经典”的古典吉他对象。将新价格设置为100美元,并显示有关吉他对象的所有信息。

     

II。制作价格为135美元且类型为“电”的电吉他物品。在促销时更改价格并显示有关Guitar对象的所有信息。

我试图自己解决这个问题,但我是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;
}

我有两个错误:

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

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

修改:将100更改为100.0后,又出现了4个错误:

  
      
  1. 形式参数列表中的不匹配
  2.   
  3. 表达式必须具有整数或无范围枚举类型
  4.   
  5. 无法确定功能模板std::endl的哪个实例;意图是
  6.   
  7. &#39;&lt;&lt;&#39;:无法解决功能过载
  8.   

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

guitar1.setprice(100.0)<<endl;

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

2 个答案:

答案 0 :(得分:3)

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

100更改为100.0double字面值)应解决此问题。

答案 1 :(得分:-1)

通常我们没有在这里修理家庭作业。最好问一下&#34;为什么这行代码不起作用&#34;而不是在这里扔一堆作业,希望能让其他人做好准备......

请记住,您的问题是&#34;关闭主题&#34;这是因为:

  

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

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

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读取到位。在这里给出一个&#39; :: read&#39;也是一个好主意。选择未绑定到命名空间的posix。

提示不使用using namespace是教条主义吗?我个人的经验很简单,如果您使用它,如果您的代码稍后(重新)用于更大的应用程序,则可能会遇到问题。对于 me ,必须编写我的代码,可以<重新>使用(重新)使用而不会出现问题,或者将来很多采用/更正。

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

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