不断收到错误''operator >>不匹配';

我看到了许多其他的错误都相同的问题,但是这些问题来自那些没有使>>运算符超载的人。这个问题与其他一些我编写的程序非常相似,因为它们都是练习题。

我也查看了我的教科书,并将我的程序与示例程序进行了比较,看不到我要去哪里哪里。

完整错误是(在main.cpp中)

第17行:错误:'operator >>'不匹配(操作数类型为'std :: ifstream {aka std :: basic_ifstream}'和'Suitcase()')|

任何意见和建议都将不胜感激。

我的标题是

//suitcase.h
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#ifndef SUITCASE_H
#define SUITCASE_H
using namespace std;

class Suitcase
{
public:
    Suitcase();
    Suitcase(double p,double w,double v,string s,string b);
    ~Suitcase();
    double calc_ratio();
    friend bool operator>(const Suitcase s1,const Suitcase s2);
    friend ostream& operator<<(ostream & out,const Suitcase& s);
    friend istream& operator >>(istream& in,Suitcase& s);
private:
    double price,weight,volume;
    string brand,shop;
};
#endif // SUITCASE_H

我的实现是

//suitcaseimplement.cpp
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include "suitcase.h"
using namespace std;

Suitcase::Suitcase()
{
    price=0;
    weight=0;
    volume=0;
    shop="";
    brand="";
}
Suitcase::Suitcase(double p,string b)
{
    price=p;
    weight=w;
    volume=v;
    shop=s;
    brand=b;
}
Suitcase::~Suitcase()
{

}
double Suitcase::calc_ratio()
{
    return (volume/weight);
}
bool operator>(Suitcase s1,Suitcase s2)
{
    if(s1.calc_ratio()>s2.calc_ratio())
        return true;
}
ostream& operator<<(ostream & out,const Suitcase& s)
{
    out<<"The suitcase with the highest ratio is the "<<s.brand<<endl;
    out<<"It is available at "<<s.shop<<endl;
    out<<"It weighs "<<s.weight<<"kgs,has a volume of "<<s.volume<<"and costs R"<<s.price<<endl;

    return out;
}
istream& operator >>(istream& in,Suitcase& s)
{
    in>>s.price>>s.weight>>s.volume>>s.brand>>s.shop;
    return in;
}

最后我的主程序是

//main.cpp
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include "suitcase.h"
using namespace std;

int main()
{
    ifstream infile;
    infile.open("Suitcase.txt");
    if(infile.fail())
        exit(1);

Suitcase current_suitcase(),best_suitcase();
infile>>best_suitcase;
while(infile>>current_suitcase)
{
    if(current_suitcase>best_suitcase)
    {
        current_suitcase=best_suitcase;
    }
}
infile.close();
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);
cout<<best_suitcase;
return 0;
}
tanghui22222 回答:不断收到错误''operator >>不匹配';

此行

build.gradle

声明两个返回Suitcase current_suitcase(),best_suitcase(); 的函数,而不是定义两个变量。这称为Most vexing parse规则。删除多余的括号可以解决问题:

Suitcase

也不要执行using namespace std

,

在C ++中,当您必须初始化不带参数的对象时,请勿放入(),因为它可以被解析为带有空初始化器或函数声明的对象定义,语言标准指定该歧义始终是解决,赞成使用函数声明。所以代替

Suitcase current_suitcase(),best_suitcase();

使用

Suitcase current_suitcase,best_suitcase;

注意:可以使用大括号(Suitcase current_suitcase{};

来调用空的初始化程序)

以防万一:

  • 请注意,将bool operator>(const Suitcase s1,const Suitcase s2);上的const限定符应用于一个对象,并且这些对象是由复制构造函数创建的,因此const限定符在这种情况下是无用的,而是取而代之将const移到参数中,将那些参数更改为对象的别名,因此以这种方式bool operator>(const Suitcase& s1,const Suitcase& s2);

  • 声明运算符
  • 如果您想显式地使用一个空析构函数,请使用此sintax Suitcase::~Suitcase() = default;,但要考虑到C ++已经有一个默认析构函数,它将像您一样使用空析构函数进行相同的操作

  • 使用using namespace std;并不是一个好趋势:相反,只需声明要使用该名称空间的函数,就像using std::cout; using std::cin;

本文链接:https://www.f2er.com/3080614.html

大家都在问