2017-06-06 59 views
-1

我想重载istream(>>)的类运算符,出于某种原因我得到错误Ambiguous overload for operator>>。 ostream的运营商完美运作,但istream却不行。 有人知道为什么吗?类运算符的模糊过载>>

#include <iostream> 
#include <fstream> 
using namespace std; 

class Person 
{ 
    public: 
     Person(string name="Empty", int num=0) 
     :name(name), num(num){} 

     friend istream& operator>> (istream& is, Person& o) 
     { 
     is >> o.name>> o.num; 
     return is; 
     } 

     friend ostream& operator<< (ostream& os, Person& o) 
     { 
     return os << o.name<< " " << o.num<< endl; 
     } 
    private: 
     string name; 
     int num; 

}; 

int main() 
{ 
    ifstream fajl("input.txt"); 

    Person a(); 
    fajl >> a ; 
    cout << a ; 

} 

input.txt中:

Name1 15 
Name2 16 

我得到了行错误:fajl >> a ;

+0

'朋友的ostream&运算符<<(ostream的和OS,常量人&O)' –

+0

什么是'Osaba'和'Person'之间的关系? –

+0

请发布[MCVE]。 –

回答

2

这不是一个变量声明:

Person a(); 

函数声明 。正确的代码来声明一个变量是:

Person a; 
+1

“*最烦人的语法分析*”的链接或说明会很好。也许https://stackoverflow.com/questions/1424510/most-vexing-parse-why-doesnt-aa-work或https://en.wikipedia.org/wiki/Most_vexing_parse –

+0

这是**不是**最令人烦恼的解析。它只是一个函数声明。请参阅@Robᵩ提供的链接中的文字。 –

+2

稍微令人烦恼的解析 –