使用 >> 运算符重载时出错
Error while using >> operator overloading
错误看起来像这样(倒数第二行):
Error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Complex()')|
代码如下:
#include <iostream>
using namespace std;
class Complex {
private:
int a, b;
public:
Complex(int x, int y) {
a = x;
b = y;
}
Complex() {
a = 0;
b = 0;
}
friend ostream& operator << (ostream &dout, Complex &a);
friend istream& operator >> (istream &din, Complex &a);
};
ostream& operator << (ostream &dout, Complex &a) {
dout << a.a << " + i" << a.b;
return (dout);
}
istream& operator >> (istream &din, Complex &b) {
din >> b.a >> b.b;
return (din);
}
int main() {
Complex a();
cin >> a;
cout << a;
}
Complex a();
这是一个vexing parse。您认为它的意思是“default-initialize 变量 a
,其类型为 Complex
”。但是,编译器将其解析为“声明一个名为 a
的函数,它不带任何参数,returns 一个 Complex
值。”语法含糊不清:它可能意味着任何一个,但语言更喜欢函数声明而不是变量声明。
因此,a
是函数,不是变量。
的确,没有声明的带有函数的运算符重载,这就是您收到错误的原因。注意错误中调用的具体类型:
operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Complex()'
parens indicate a function ^^
要解决此问题,请将此行替换为以下之一:
Complex a{}; // C++11 and later only; uniform initialization syntax
Complex a; // All versions of C++
这些都不是模棱两可的;它们只能被解析为变量声明。
错误看起来像这样(倒数第二行):
Error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Complex()')|
代码如下:
#include <iostream>
using namespace std;
class Complex {
private:
int a, b;
public:
Complex(int x, int y) {
a = x;
b = y;
}
Complex() {
a = 0;
b = 0;
}
friend ostream& operator << (ostream &dout, Complex &a);
friend istream& operator >> (istream &din, Complex &a);
};
ostream& operator << (ostream &dout, Complex &a) {
dout << a.a << " + i" << a.b;
return (dout);
}
istream& operator >> (istream &din, Complex &b) {
din >> b.a >> b.b;
return (din);
}
int main() {
Complex a();
cin >> a;
cout << a;
}
Complex a();
这是一个vexing parse。您认为它的意思是“default-initialize 变量 a
,其类型为 Complex
”。但是,编译器将其解析为“声明一个名为 a
的函数,它不带任何参数,returns 一个 Complex
值。”语法含糊不清:它可能意味着任何一个,但语言更喜欢函数声明而不是变量声明。
因此,a
是函数,不是变量。
的确,没有声明的带有函数的运算符重载,这就是您收到错误的原因。注意错误中调用的具体类型:
operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'Complex()'
parens indicate a function ^^
要解决此问题,请将此行替换为以下之一:
Complex a{}; // C++11 and later only; uniform initialization syntax
Complex a; // All versions of C++
这些都不是模棱两可的;它们只能被解析为变量声明。