2016-07-15 14 views
0

std :: coutの "< <"演算子をオーバーロードしようとする小さなコードスニペットがあります。<< ostreamで<<演算子がオーバーロードされていません。どうして?

#include<iostream> 
using namespace std; 

ostream& operator<<(ostream& out,const string& str) 
{ 
    out << "overloading" << str << "done"; 
    return out; 
} 

int main() 
{ 
    cout << "string123"; 
} 

出力:string123。 私のオーバーロード機能が呼び出されていないようです。どうして?

+0

次のとおりです。 //en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt)これは 'std :: string'を受け取りますか? –

+2

@JoachimPileborgおそらく、 'const char *'を受け入れるものです。 – juanchopanza

+0

@JoachimPileborg 'std :: string'を受け入れるオーバーロードは' 'ヘッダで定義されていますが、ここには含まれていません。 –

答えて

1

まず、あなたはstd::stringですが、const char*はストリーミングしていません。代わりにcout << std::string("string123")と書いて修正することができます(demo;しかし、ewですが)。

、このような過負荷が<string>にすでに存在していることに注意してください、そして、あなたの実装が明らかにちょうど行く<string>as does mine、およびその特権があるとして)<iostream>経由を含めることが起こります。しかし、あなたのバージョン(上記の修正を加えた後)は、それを見つけるためにADLを呼び出す必要がないので、より良い一致です。

1

あなたは<<に文字列型を送信する必要があります。

ostream& operator<<(ostream& out,const string& str) 
{ 
    out<<"overloading"; 
    return out; 
} 

int main() 
{ 
    string s = "string123"; 
    cout << s; 
} 

<<定義で再び文字列自身を送信するあなたは、基本的に自分自身を撮影している

out << "overloading" << str <<"done" 
+0

あなたの例は間違っています、strは 'out'に送られません – buld0zzr

+0

@ buld0zzr私はちょうどそれを実行し、期待どおりに動作します –

+0

" overloading "という文字列を出力しますが、" string123 "を出力しません – buld0zzr

1

のための無限の再帰を行うことをあなたの事例に足を踏み入れてください。 std::stringタイプのためにoperator<<をオーバーロードするので、 "std :: string"をoutに送信しようとするたびに呼び出され、ランタイムスタックのオーバーローが発生すると予想されるはずです。あなたは、それを動作させるには:

  • operator<<過負荷にoutに出力するchar *タイプが必要なので、それは無限再帰
  • を起こさないことmainの実際のstd::stringを送ります。

ここでは、ランタイム・スタックオーバーフロー問題なく動作例を示します

#include<iostream> 
using namespace std; 
ostream& operator<<(ostream& out, const string& str) 
{ 
    out << "overloading" << str.c_str() << "done"; 
    return out; 
} 

int main() 
{ 
    cout << std::string("string123"); 
} 

すでに*(HTTP [出力オペレータのオーバーロード] *があるので出力はたぶん

overloadingstring123done 
+0

str.c_str()はすべて違いがあります:) ..ありがとう – user2531608

+0

@ user2531608 upvote and answer acceptance is thanks to :) – buld0zzr

関連する問題