1

ストリーミングはstringstreamlibstdc++ 拡張機能ですか? このプログラムはgcc-4.2gcc-4.7-2 (using -std=c++03)、および clang 3.2 で and を使用して-std=c++11コンパイルされますlibstdc++(Andy Prowl のおかげです。コメントを参照してください)。andをclang 3.2使用してコンパイルしません。-std=c++11-stdlib=libc++

#include<iostream>
#include<sstream>
int main() {

  std::stringstream s; s << "b";

  std::cout << "ss: " << s << std::endl;

  return 0;
}

ofstream のコンストラクターを見ると、std::basic_streambuf<CharT, Traits>*またはを取ることができますbasic_ostream& st。文字列ストリームは ですがstd::basic_istream、どちらもstd::basic_ios<CharT, Traits>そうなので、うまくいくはずです。

次の変更により、コードは clang でコンパイルされます。

  std::cout << "ss: " << s.str() << std::endl;

それを行う正しい方法は何ですか?cout << s;またはcout << s.str();

4

4 に答える 4

7

いいえ、C++03 と C++11 の違いです。すべてのストリームには、 and を使用してコードを有効にする変換演算子がif (s)ありwhile (s)ます。C++03 では、これは通常、operator void*()または同様のものです。

C++11 では明示的な演算子があります。ここで、 は に対して機能しますが、 に対してはexplicit operator bool()機能しif (s)ませんcout << s

于 2013-02-08T18:20:14.320 に答える
4

実際には、これは C++98 と C++03 でのみコンパイルされます。これは、変換関数void*が存在するためにすべてのストリーム クラスが暗黙的に変換されるため、暗黙的に変換されるためです。operator void*()sstd::cout << svoid*

void*ただし、C++11 では、C++11 がinifやなどのように、コンテキストに応じてブール値ではなくブール値に変換できる明示的なものを作成したため、コードはコンパイルされませんwhile

于 2013-02-08T18:23:32.713 に答える
-1

std::stringstream をストリーミングするためのオーバーロードはありませんが、使用できます

std::cout << "ss: " << s.str() << std::endl;
于 2013-02-08T18:20:35.403 に答える