2016-11-26 43 views
0

這裏建設是https://msdn.microsoft.com/en-us/library/1z2f6c2k.aspxC++重載ostream的不默認工作與空參數

#include <iostream> 
using namespace std; 

class Date 
{ 
    int mo, da, yr; 
public: 
    Date() 
    { 
     mo = 10; da = 10; yr = 99; 
    } 
    Date(int m, int d, int y) 
    { 
     mo = m; da = d; yr = y; 
    } 
    friend ostream& operator<<(ostream& os, const Date& dt); 
}; 

ostream& operator<<(ostream& os, const Date& dt) 
{ 
    os << dt.mo << '/' << dt.da << '/' << dt.yr; 
    return os; 
} 

int main() 
{ 
    Date dt0(); 
    cout << dt0 << endl; 

    Date dt(5, 6, 92); 
    cout << dt; 
} 

我期望的輸出是

10/10/99 
5/6/92 

採取了一個例子,但我所得到的是

1 
5/6/92 

什麼或如何解決這個問題?

回答

4

歡迎C++,你可以在那裏跳閘因爲most vexing parse!

dt0起來是一個對象,它是一個功能!輸出時,實際上輸出的函數dt0的地址始終爲真,即1

,可隨時更換(){},所以沒有歧義發生:

Date dt0{}; 

或者剛落括號乾脆:

Date dt0; 
+0

謝謝你的澄清!最好的答案在幾分鐘內! – user3221454

+1

大家知道,'cout <<&dt0 << endl'將打印相同的輸出,因爲兩者都表示函數的地址。 (並且明確地說,如果你確實是這麼想的話,它可以減少一些編譯器的警告。) –

+1

@Dean我已經知道了,不過謝謝:) – Rakete1111