2017-06-06 11 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、constの人&O)は、' 'Osaba'と' Person'の関係は –

+0

は何ですか? –

+0

[MCVE]を投稿してください。 –

答えて

2

これは、変数の宣言ではありません。

Person a(); 

関数宣言である 。変数を宣言するための正しいコードは次のとおりです。

Person a; 
+1

"* most vexing parse *"のリンクや説明がうまくいくはずです。おそらくhttps://stackoverflow.com/questions/1424510/most-vexing-parse-why-doesnt-aa-workまたはhttps://en.wikipedia.org/wiki/Most_vexing_parse –

+0

これは**ほとんど**ではありません厄介な解析。これは単なる関数宣言です。 @Robᵩが提供したリンクのテキストを参照してください。 –

+2

少し厄介な解析 –