【问题标题】:C++ overloading >> operator strange compile errorC++重载>>运算符奇怪的编译错误
【发布时间】:2011-09-14 12:12:05
【问题描述】:
#include <iostream>
#include <string>

using namespace std;

class phonebook
{
    string name;
    string prefix;
public:
    phonebook(string &name, string &prefix)
    {
        this->name = name;
        this->prefix = prefix;
    }

    friend istream &operator>>(istream &in, phonebook &book);
};

istream &phonebook::operator>>(istream &in, phonebook &book)
{
    in >> book.name >> book.prefix;
    return in;
}

int main()
{
    return 0;
}

当我尝试使用 g++ 4.6.1 编译这段代码时:

"main.cpp:20: error: ‘std::istream& phonebook::operator>>(std::istream&, phonebook&)’ 必须只有一个参数”

PS:问这个问题很愚蠢……太明显了:S。不过还是谢谢你。

【问题讨论】:

    标签: c++ operator-overloading overloading


    【解决方案1】:

    您不能重载 operator &gt;&gt; 以作为成员函数进行流式传输。任何定义为成员函数的运算符都将其第一个参数作为对 (const) Type 的引用,其中 Type 是您的类名 - 在本例中为电话簿。

    你需要改变

    istream &phonebook::operator>>(istream &in, phonebook &book)
    

    istream & operator>>(istream &in, phonebook &book)
    

    【讨论】:

      【解决方案2】:

      friend 函数不是成员。事实上,它期望&gt;&gt; 运算符的左侧是phonebook。将函数定义的第一行(类外)更改为:

      istream &operator>>(istream &in, phonebook &book)
      

      注意没有phonebook::,因为它不是会员。

      【讨论】:

        【解决方案3】:

        phonebook 没有名为 opeartor&gt;&gt; 的方法

        你说存在一个 global 函数是phonebook 的朋友,因此你应该从operator&gt;&gt; 的实现中删除phonebook::

        【讨论】:

          【解决方案4】:

          因为你声明了friend istream &amp;operator&gt;&gt;(istream &amp;in, phonebook &amp;book);

          所以这个操作符>>不是电话簿的成员函数。

          引用自 C++ 03 标准

          11.4 朋友 类的朋友是一个函数或类,它不是类的成员,但允许使用类中的私有和受保护的成员名称。朋友的名字不在类的范围内,除非它是另一个类的成员,否则不会用成员访问运算符 (5.2.5) 调用朋友。

          所以删除phonebook:: 会起作用:

          istream& operator>>(istream &in, phonebook &book)
          {
              in >> book.name >> book.prefix;
              return in;
          }
          

          【讨论】:

            【解决方案5】:

            当你在类中声明函数为友元时,你要么在类中定义它,要么让它成为一个非成员函数。

            istream & operator>>(istream &in, phonebook &book)
            {
                in >> book.name >> book.prefix;
                return in;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-06
              • 1970-01-01
              • 1970-01-01
              • 2018-06-16
              相关资源
              最近更新 更多