2014-02-13 56 views
0

我有一個類我在哪裏超載< <和+運營商這樣的:運算符重載編譯在Visual Studio 2013而不是gcc的

friend MyObject operator+(MyObject lhs, MyObject rhs){ 
     MyObject obj; 
     obj.Property = lhs.Property + rhs.Property; 
     return obj; 
    } 

    friend std::ostream& operator<<(std::ostream& os, MyObject& n) { 
     os << MyObject.Property;  //property is a double 
     return os; 
    } 

此編譯在Visual Studio和GNU沒有++ 98問題。我也可以打電話給他們這樣沒有任何問題:

MyObject obj1, obj2; 
obj1.PutInValidState(); 
cout << obj1; 
obj1 = obj1 + obj2; 

然而,當我打電話給他們,同時這樣的:

cout << obj1 + obj2; 

Visual Studio將編譯它(並給出正確的輸出) ,但gnu ++ 98給我錯誤「不匹配'運營商< <'在' std :: operator < <(std :: basic_ostream &,const char *)」。我可以得到它的編制都在這樣的函數定義常量添加到參數:

friend std::ostream& operator<<(std::ostream& os, const MyObject& n) { 

這到底是怎麼回事?爲什麼我需要const來使它在gnu ++ 98中工作,而不是在Visual Studio中?

+1

在Visual Studio中打開警告。 G ++實際上在這裏是正確的,VS會告訴你,如果你注意。 –

回答

2
cout << obj1 + obj2; 

是語法糖

operator<<(cout, operator+(obj1,obj2)); 

在這裏你可以看到,在您的運營商的n參數< <()超載被綁定到值由運營商+()返回,這是一個臨時對象。現在,在C++中,有一條規則,非const引用參數可以將而不是綁定到臨時對象,這就是爲什麼它不會在gcc中編譯的原因。

另一方面,Visual Studio具有允許非const引用參數綁定到臨時對象的語言擴展。我希望它沒有,因爲這個擴展是在將代碼移植到其他編譯器時咬過我的其中一個。

+0

VS2013有一個混亂這個標誌。 – Yakk

+0

@Yakk ...應該默認設置,但不是。不得不指示工具*不*做*非*標準動作是......惱人的。 – WhozCraig

相關問題