从函数返回stringstream

Hoo*_*ked 11 c++ stringstream

显然,我在这里遗漏了一些关于字符串流的重要信息,但有人可以解释原因

#include <sstream>
using namespace std;

stringstream foo() {
  stringstream ss;
  return ss;
}
Run Code Online (Sandbox Code Playgroud)

失败了

In file included from /usr/include/c++/4.4/ios:39,
             from /usr/include/c++/4.4/ostream:40,
             from /usr/include/c++/4.4/iostream:40,
             from rwalk.cpp:1:/usr/include/c++/4.4/bits/ios_base.h: In copy constructor ‘std::basic_ios<char,    std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’:/usr/include/c++/4.4/bits/ios_base.h:790: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
/usr/include/c++/4.4/iosfwd:47: error: within this context
/usr/include/c++/4.4/iosfwd: In copy constructor ‘std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(const std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)’:
/usr/include/c++/4.4/iosfwd:75: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
/usr/include/c++/4.4/streambuf: In copy constructor ‘std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::basic_stringbuf(const std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >&)’:
/usr/include/c++/4.4/streambuf:770: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]’ is private
/usr/include/c++/4.4/iosfwd:63: error: within this context
/usr/include/c++/4.4/iosfwd: In copy constructor ‘std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(const std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)’:
/usr/include/c++/4.4/iosfwd:75: note: synthesized method ‘std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::basic_stringbuf(const std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >&)’ first required here 
rwalk.cpp: In function ‘std::stringstream foo()’:
rwalk.cpp:12: note: synthesized method ‘std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(const std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)’ first required here 
Run Code Online (Sandbox Code Playgroud)

如何从函数中正确返回字符串流?(编辑:为完整的代码段添加了标题并修复了拼写错误)

How*_*ant 19

在更正返回类型中的type-o之后(由Mahesh注释),您的代码将无法在C++ 03中编译,因为stringstream它不可复制.但是,如果你的编译器支持C++ 0x中,把上允许你的代码,因为编译stringstreamMoveConstructible.


wil*_*ell 12

您无法按值返回函数流,因为这意味着您必须复制流.C++流不可复制.

  • @Hooked并不清楚流副本的语义是什么.当你写入一个副本时,写入是否也应该发生在另一个副本中?当你关闭一个流时,另一个流也应该关闭吗?当您更改一个流的区域设置时,另一个区域也应该更改吗?在正确的程序中,您不应该使用_need_来复制流. (5认同)

Bug*_*tGG 5

老问题,但我相信实现您想要的正确方法是使用stringstream::str方法,该方法返回一个字符串对象,其中包含流缓冲区中当前内容的副本。

这是一个带有string str() const;.

std::string foo() {
    stringstream ss;
    ss << "add whatever you want to the stream" << 12 << ' ' << 13.4;
    return ss.str();
}

int main() {
    std::cout << foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印:

add whatever you want to the stream 12 13.4 
Run Code Online (Sandbox Code Playgroud)