C++:「operator<<(cout, 1);」錯誤

大家好:

我之前一直以為以下二個指令相同

「operator << (cout, 1);」

「cout << 1;」

但今天意外發現「operator << (cout, 1);」會發生ambigious

請問這二個指令有什麼不同呢?

為什麼第一個會error而第二個不會呢?

謝謝

Update:

To 龍:請問

1.就我所知「operator<<」是以friend型式出現在class裡,

所以class呼叫方法是「operator<<(cout, obj);」。

而你說的built-in type方法是「cout.operator<<(obj)」,

意思是說built-in type的operator<<是定義在ostream內的嗎?

Update 2:

2.我看Dev-C++訊息發現「operator<<」overload幾個版本都是char相關,

但沒有int版,因此error,是否如我上一點所說的int版定義在ostream內?

為什麼「char相關」的版本不定義在ostream內呢?

Update 3:

查了一下ostream內容,built-in type真的定義在裡面^^

Update 4:

龍:你的解答是否要移到回答部份呢,在意見欄案子結不了 0.0。

2 Answers

Rating
  • Lv 7
    1 decade ago
    Favorite Answer

    cout << 1;

    應等於

    cout.operator << (1);

    才對.

    因cout的定義是

    extern ostream cout;

    所以cout的型態是ostream.而ostream裡有operator<<.所以

    cout << 1;

    等於

    cout.operator << (1);

    而不是operator << (cout, 1);

    2008-05-09 14:15:08 補充:

    operator << (cout, 1);會在Dev-C++出現錯誤的原因是因為c++裡以有好幾個內定的過載operator <<()了.

    在Dev-C++裡有

    std::basic_ostream & std::operator<<(std::basic_ostream &, char)

    std::basic_ostream & std::operator<<(std::basic_ostream &, signed char)

    2008-05-09 14:15:14 補充:

    std::basic_ostream & std::operator<<(std::basic_ostream &, unsigned char)

    1可當char或signed char或unsigned char.所以出錯

    不知在VC++裡是否出同樣的錯誤(出差中,手提電腦只有Dev-C++)

    懂不懂?不懂請再問

    2008-05-10 14:18:00 補充:

    沒錯

    ostream & operation << (ostream &, const &);

    這個函式是經常以friend型式出現在user defined class裡沒錯.原因是因為你無法過載ostream裡的operator <<().

    但是cout已是ostream的object.且ostream裡有過載operation <<().所以你每次用cout << ...;時C++都會先在ostream裡找是否有合適operation <<()可用.若無就再到basic_ostream裡找.

    2008-05-10 14:18:30 補充:

    若再無才到一般的

    ostream & operation << (ostream &, const &);

    裡找.也就是說先自己解決.若自己解決不了再請父母.父母解決不了才向旁人求助.

    不是.c++之所以會找

    std::basic_ostream & std::operator<<(std::basic_ostream &, char)

    是因為你在寫operator << (cout, 1);時以告訴C++你要用

    std::basic_ostream & std::operator<<(std::basic_ostream &, char)

    這種板本了.

    2008-05-10 14:19:17 補充:

    cout << ...;可能轉換成

    operator << (cout, ...);

    operator << (cout, ...);

    不可能轉換成

    cout << ...;

    懂不懂?不懂請再問

    2008-05-11 00:01:05 補充:

    cout 《 1;

    應等於

    cout.operator 《 (1);

    才對.

    因cout的定義是

    extern ostream cout;

    所以cout的型態是ostream.而ostream裡有operator《.所以

    cout 《 1;

    等於

    cout.operator 《 (1);

    而不是operator 《 (cout, 1);

    operator 《 (cout, 1);會在Dev-C++出現錯誤的原因是因為c++裡以有好幾個內定的過載operator 《()了.

    在Dev-C++裡有

    std::basic_ostream & std::operator《(std::basic_ostream &, char)

    std::basic_ostream & std::operator《(std::basic_ostream &, signed char)

    std::basic_ostream & std::operator《(std::basic_ostream &, unsigned char)

    1可當char或signed char或unsigned char.所以出錯

    不知在VC++裡是否出同樣的錯誤(出差中,手提電腦只有Dev-C++)

    懂不懂?不懂請再問

    -----------------------------

    沒錯

    ostream & operation 《 (ostream &, const &);

    這個函式是經常以friend型式出現在user defined class裡沒錯.原因是因為你無法過載ostream裡的operator 《().

    但是cout已是ostream的object.且ostream裡有過載operation 《().所以你每次用cout 《 ...;時C++都會先在ostream裡找是否有合適operation 《()可用.若無就再到basic_ostream裡找.

    若再無才到一般的

    ostream & operation 《 (ostream &, const &);

    裡找.也就是說先自己解決.若自己解決不了再請父母.父母解決不了才向旁人求助.

    不是.c++之所以會找

    std::basic_ostream & std::operator《(std::basic_ostream &, char)

    是因為你在寫operator 《 (cout, 1);時以告訴C++你要用

    std::basic_ostream & std::operator《(std::basic_ostream &, char)

    這種板本了.

    cout 《 ...;

    可能轉換成

    operator 《 (cout, ...);

    operator 《 (cout, ...);

    不可能轉換成

    cout 《 ...;

    懂不懂?不懂請再問

    Source(s): Myself
    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    #include

    #include

    int isodd(int n);

    main()

    {

    int num,A,i;

    for (i=1;i&lt;=2;i ){

    printf(&quot;Enter an integer: &quot;);

    scanf(&quot;%d&quot;,&num);

    A = isodd(num);

    printf(&quot;absolute value of %d is %d&#92;n&quot;,num,A);

    }

    system(&quot;PAUSE&quot;);

    }

    int isodd(int n)

    {

    if (n%2 == 0)

    return n=0;

    else

    return n=1;

    }

    Source(s): 結構化程式設計上課中...
    • Commenter avatarLogin to reply the answers
Still have questions? Get your answers by asking now.