簡體   English   中英

C ++重載>>運算符奇怪的編譯錯誤

[英]C++ overloading >> operator strange compile error

#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:錯誤:'std :: istream&phonebook :: operator >>(std :: istream&,phonebook&)'必須只接受一個參數”

PS:這是非常愚蠢的事情......很明顯:S。 謝謝你。

您不能重載operator >> for streaming作為成員函數。 任何被定義為成員函數的運算符都將其第一個參數作為對(const)Type的引用,其中Type是您的類名 - 在本例中為phonebook。

你需要改變

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

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

friend功能不是會員。 實際上,它期望>>運算符的左側是phonebook 將函數定義的第一行(類外)更改為:

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

請注意,沒有phonebook::因為它不是會員。

phonebook沒有一個叫做opeartor>>的方法

您聲明存在一個全局函數,它是phonebook的朋友,因此,您應該從operator>>的實現中刪除phonebook::

因為你宣布了friend istream &operator>>(istream &in, phonebook &book);

所以這個運營商>>不是電話簿的成員功能。

從C ++ 03標准引用

11.4朋友類的朋友是一個函數或類,它不是類的成員,但允許使用類中的私有和受保護的成員名。 朋友的名稱不在類的范圍內,並且除非成員是另一個類的成員,否則不會使用成員訪問運算符(5.2.5)調用該朋友。

所以刪除phonebook::會工作:

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

當你在類中聲明一個朋友的函數時,你要么在類中定義它,要么使它成為非成員函數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM