2011-09-29 42 views
3

我試圖超載運算符< <。我期待的輸出是InitializingHello WorldOut,但它只是輸出Hello World。我無法弄清楚我的代碼有什麼問題。謝謝你的幫助。重載I/O運算符C++

#include <iostream> 
    using namespace std; 


    ostream &operator << (ostream &out, const char* &s) 
    { 
    out << "Initializing" << s << "Out"; 
    return out; 
    } 

    void main() { 

    cout << "Hello World" << endl; 
    system("Pause"); 
    } 

回答

2

< <與原型完全相同已經出現過載。編譯器不能決定使用哪一種?

+0

如果是這樣,他會得到鏈接錯誤的情況。對? –

+2

原型不一樣,標準的不是參考。即使它們在相同的地方,他也不會因爲它們位於不同的命名空間而導致鏈接器錯誤;他會得到一個模糊的電話。 – rodrigo

+2

如果編譯器無法確定,他會得到一個編譯器錯誤。編譯器不會隨機選擇一個... –

0

我認爲既然左手側是在std命名空間,它使用在該std命名空間,而不是您在全局命名空間中定義的功能ostream& std::operator << (ostream &out, const char* s)。如果你試圖把你的名字空間放入std,你會得到一個鏈接錯誤。你唯一的真正希望是改變一方或另一方的類型,可能是通過圍繞它們來包裝。

struct charptr { 
    const char* ptr; 
    charptr(const char* p) :ptr(p) {} 
}; 
ostream &operator << (ostream &out, const charptr &s) 
{ 
    out << "Initializing" << s.ptr << "Out"; 
    return out; 
} 
int main() { //int main, not void 
    cout << charptr("Hello World") << endl; 
    system("Pause"); 
} 
+0

您必須使'charptr&'參數爲'const'。 – sth

+0

我不認爲有'std :: operator <<(ostream&out,const char *&s)'。然而,有一個'std :: operator <<(ostream&out,const char * s)'。注意第二個參數中的參考。 –

+0

是的,你們倆。 Fix'd。 –

3

"Hello World"實際上const char[12]類型,可衰變成const char *型的R值(臨時)是,但你的函數需要一個參考const char*,正如你可能知道,你不能綁定對非常量r值的引用。所以你的運營商不叫,但標準的ostream &operator << (ostream &out, const char* s)是。

PS。請不要寫void main()。它應該是int main(),除非你在嵌入式系統中(不太可能)。

+0

即使在嵌入式系統中,void main()也不是main的有效C++簽名。 –

1

已經有一個operator<<const char*定義在標準庫中,它在輸出中使用。不會使用您的重載,因爲臨時字符串文字不能綁定到運算符第二個參數中的非const引用。

如果您刪除引用或使其爲const,那麼您的運營商調用。它甚至不會與標準庫中的相沖突,因爲該函數是作爲函數模板實現的。你的不是,編譯器更喜歡非模板化的函數。

如果它被調用,則會導致堆棧溢出,因爲out << "Initializing"會立即再次遞歸調用同一個運算符。

0

羅德里戈指出,一個字符串類型是const char[x],我有一個歪主意:

#include <iostream> 
using namespace std; 

template<int len> 
ostream &operator << (ostream &out, const char (&s)[len]) 
    { 
    out << ((const char*)"Initializing") << ((const char*)s) << ((const char*)"Out"); 
    return out; 
    } 

    int main() { 
    cout << "Hello World" << endl; 
    } 

http://ideone.com/7wCNy