2011-09-14 51 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; 
}