error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Oper')

error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Oper')

任务是从文件中加载复数。当代码在没有 类 的情况下编写时,只使用结构和指定的函数,它不会显示该错误。功能(>> 重叠)完全相同。

Class

#ifndef WYRAZENIE_ZESPOLONE_HH
#define WYRAZENIE_ZESPOLONE_HH

#include "liczbaZespolona.hh"

enum Oper {op_plus, op_minus, op_razy, op_dziel};

class WyrazenieZespolone {
private:
    LiczbaZespolona lz1;
    LiczbaZespolona lz2;
    Oper op;

public:
    
    WyrazenieZespolone() = default;
    WyrazenieZespolone(const LiczbaZespolona, const LiczbaZespolona, Oper);

    LiczbaZespolona oblicz() const;

    friend std::ostream& operator << (std::ostream&, const WyrazenieZespolone&);
    friend std::istream& operator >> (std::istream&, WyrazenieZespolone&);
    friend std::istream& operator >> (std::istream&, Oper&);
};

#endif

运算符重载实现

std::istream& operator >> (std::istream& strm, WyrazenieZespolone& wz){
    strm >> wz.lz1 >> wz.op >> wz.lz2;

    return strm;
}

std::istream& operator >> (std::istream& strm, Oper& t_op){
    char znak;

    strm >> znak;
    switch(znak){
        case '+': {t_op = op_plus; break;} 
        case '-': {t_op = op_minus; break;}
        case '*': {t_op = op_razy; break;}
        case '/': {t_op = op_dziel; break;}
        default : {strm.setstate(std::ios::failbit);}
    }
    
    return strm;
}

我在编译过程中遇到这样的错误,即使 vs code 没有显示任何错误

error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Oper')
     strm >> wz.lz1 >> wz.op >> wz.lz2;
     ~~~~~~~~~~~~~~~^~~~~~~~

问题 是在您写的时候:

strm >> wz.lz1 >> wz.op >> wz.lz2;

编译器没有重载std::istream& operator >> (std::istream& strm, Oper& t_op)定义,因为它是在之后定义的。

所以要解决这只是将std::istream& operator >> (std::istream& strm, Oper& t_op)的定义移动到std::istream& operator >> (std::istream& strm, WyrazenieZespolone& wz)的定义之前,如下所示。那是为了让strm >>wz.op起作用,在使用前定义相应的重载operator>>

同样,要使strm >> wz.lz1起作用,在使用前定义相应的重载operator>>。这显示在下面的代码片段 Working demo.

//this comes first so that it can be used in strm >>wz.op
std::istream& operator >> (std::istream& strm, Oper& t_op){
    char znak;

    strm >> znak;
    switch(znak){
        case '+': {t_op = op_plus; break;} 
        case '-': {t_op = op_minus; break;}
        case '*': {t_op = op_razy; break;}
        case '/': {t_op = op_dziel; break;}
        default : {strm.setstate(std::ios::failbit);}
    }
    
    return strm;
}
//similarly this comes before so that it can be used in strm >> wz.lz1
std::istream& operator>>(std::istream& strm, LiczbaZespolona&)
{
    //do something here 
    return strm;
}
std::istream& operator >> (std::istream& strm, WyrazenieZespolone& wz){
    strm >> wz.lz1 >> wz.op >> wz.lz2;

    return strm;
}

Demo