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