2011-09-14 76 views
3
#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編譯這段代碼:C++重載>>運算奇怪的編譯錯誤

「的main.cpp:20:錯誤:「的std :: istream的&電話簿::操作>>(std :: istream &,電話簿&)'必須採用一個參數「

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

回答

5

執行刪除phonebook::您無法將operator >>作爲成員函數進行流式傳輸。定義爲成員函數的任何運算符都將其第一個參數作爲對(const)Type的引用,其中Type是您的類名 - 在本例中爲電話簿。

您需要更改

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

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

A friend功能不是會員。實際上,它期望>>運營商的左側是phonebook。該函數的定義(類外)的第一行改成這樣:

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

注意沒有phonebook::,因爲它不是一個成員。

1

phonebook沒有一個叫方法opeartor>>

您指出了存在全球功能是phonebook的朋友,所以,你應該從operator>>

0

當你聲明函數類中的朋友,你要麼把它定義在類中或使其成爲一個非成員函數。

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

因爲你宣佈friend istream &operator>>(istream &in, phonebook &book);

所以這個操作符>>是不是電話簿的成員函數。

從C++ 03標準

11.4朋友 一類的一個朋友報價是一個函數或類是類的成員,但被允許從使用private和protected成員名稱班上。朋友的名字不在類的範圍內,朋友不會被成員訪問操作符(5.2.5)調用,除非它是另一個類的成員。

所以去除phonebook::將工作:

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