错误重载运算符“>>”
error overloading operator '>>'
我正在尝试重载 >> 运算符,检查我的代码,它是最精简的程序:
#include <iostream>
#include <string>
using namespace std;
class MyClass{
private:
string bar;
int foo;
public:
MyClass(){
bar="";
foo=0;
};
istream& operator>>(istream& is){
is >> bar >> foo;
return is;
};
ostream& operator<<(ostream& os){
os << bar << foo;
return os;
};
~MyClass(){};
};
int main()
{
MyClass* a = new MyClass();
cin >> *a;
delete a;
return 0;
}
此代码无法编译,我之前用谷歌搜索过post我的问题,我发现问题可能是最令人烦恼的解析,但我无法想象如何修复它。
无论如何,我不知道问题出在哪里,当我尝试编译时,编译器抛出:
第一个:
error: no match for ‘operator>>’ (operand types are ‘std::istream {aka std::basic_istream<char>}’ and ‘MyClass’)
cin >> *a;
~~~~^~~~~
然后,在尝试将类型转换为 int、double、char 等后,它抛出:
/usr/include/c++/6.1.1/istream:924:5: nota: candidate:
std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [con _CharT = char; _Traits = std::char_traits<char>; _Tp = MyClass] <coincidencia cercana>
operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
^~~~~~~~
/usr/include/c++/6.1.1/istream:924:5: nota: conversion of argument 1 would be ill-formed:
error: no se puede unir el l-valor ‘std::istream {aka std::basic_istream<char>}’ a ‘std::basic_istream<char>&&’
cin >> *a;
如何解决这个问题?
重载输入和输出运算符不能作为成员函数完成。原因是,当您将 >>
或 <<
运算符定义为成员函数时, class 的对象实例必须位于 left 手边运营商。
而是将运算符函数定义为非成员友元函数(可以在 class 中内联完成),例如
class MyClass
{
public:
...
friend std::ostream& operator<<(std::ostream& os, MyClass const& object)
{
return os << object.bar << object.foo;
}
};
">>" 和 "<<" 运算符通常不作为成员函数实现,因为第一个参数是成员函数中 class 的隐式对象,但你可以这样做并且它会起作用如果你想在你的 main.Other 中做类似 *a >> cin 的事情,那么将这些运算符实现为全局函数,如上述答案中所述。
我正在尝试重载 >> 运算符,检查我的代码,它是最精简的程序:
#include <iostream>
#include <string>
using namespace std;
class MyClass{
private:
string bar;
int foo;
public:
MyClass(){
bar="";
foo=0;
};
istream& operator>>(istream& is){
is >> bar >> foo;
return is;
};
ostream& operator<<(ostream& os){
os << bar << foo;
return os;
};
~MyClass(){};
};
int main()
{
MyClass* a = new MyClass();
cin >> *a;
delete a;
return 0;
}
此代码无法编译,我之前用谷歌搜索过post我的问题,我发现问题可能是最令人烦恼的解析,但我无法想象如何修复它。
无论如何,我不知道问题出在哪里,当我尝试编译时,编译器抛出:
第一个:
error: no match for ‘operator>>’ (operand types are ‘std::istream {aka std::basic_istream<char>}’ and ‘MyClass’)
cin >> *a;
~~~~^~~~~
然后,在尝试将类型转换为 int、double、char 等后,它抛出:
/usr/include/c++/6.1.1/istream:924:5: nota: candidate:
std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [con _CharT = char; _Traits = std::char_traits<char>; _Tp = MyClass] <coincidencia cercana>
operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
^~~~~~~~
/usr/include/c++/6.1.1/istream:924:5: nota: conversion of argument 1 would be ill-formed:
error: no se puede unir el l-valor ‘std::istream {aka std::basic_istream<char>}’ a ‘std::basic_istream<char>&&’
cin >> *a;
如何解决这个问题?
重载输入和输出运算符不能作为成员函数完成。原因是,当您将 >>
或 <<
运算符定义为成员函数时, class 的对象实例必须位于 left 手边运营商。
而是将运算符函数定义为非成员友元函数(可以在 class 中内联完成),例如
class MyClass
{
public:
...
friend std::ostream& operator<<(std::ostream& os, MyClass const& object)
{
return os << object.bar << object.foo;
}
};
">>" 和 "<<" 运算符通常不作为成员函数实现,因为第一个参数是成员函数中 class 的隐式对象,但你可以这样做并且它会起作用如果你想在你的 main.Other 中做类似 *a >> cin 的事情,那么将这些运算符实现为全局函数,如上述答案中所述。