【问题标题】:error overloading operator '>>'错误重载运算符“>>”
【发布时间】:2016-10-18 18:58:10
【问题描述】:

我正在尝试重载 >> 运算符,检查我的代码,这是最精简的程序:

#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;
}

这段代码无法编译,我在发布我的问题之前已经用谷歌搜索过,我发现问题可能是最令人头疼的解析,但我无法想象如何解决它。

反正我不知道问题出在哪里,当我尝试编译时,编译器抛出:

第一:

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;

我可以做些什么来解决这个问题?

【问题讨论】:

  • 有人需要朋友 :-)

标签: c++ c++11 operator-overloading istream


【解决方案1】:

重载输入和输出操作符不能作为成员函数来完成。原因是当您将&gt;&gt;&lt;&lt; 运算符定义为成员函数时,该类的对象实例必须位于运算符的左侧

而是将运算符函数定义为非成员友元函数(可以在类中内联完成),例如

class MyClass
{
public:
    ...

    friend std::ostream& operator<<(std::ostream& os, MyClass const& object)
    {
        return os << object.bar << object.foo;
    }
};

【讨论】:

    【解决方案2】:

    ">>" 和 "> cin 在您的 main.Other wise 将这些运算符实现为全局函数,如上述答案中所述。

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2015-07-04
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多