13

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

#include <sstream>
using namespace std;

stringstream foo() {
  stringstream ss;
  return ss;
}

失败

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 

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

4

6 回答 6

19

在更正返回类型中的 type-o 后(由 Mahesh 指出),您的代码将无法在 C++03 中编译,因为stringstream不可复制。但是,如果您的编译器支持 C++0x,打开它可以让您的代码编译,stringstream因为MoveConstructible.

于 2011-02-25T16:51:38.710 回答
12

您不能按值从函数返回流,因为这意味着您必须复制流。C++ 流不可复制。

于 2011-02-25T16:46:49.257 回答
6

老问题,但我相信实现您想要的正确方法是使用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;
}

打印:

add whatever you want to the stream 12 13.4 
于 2016-04-19T18:03:21.207 回答
3

虽然它在 C++03 中不起作用,但它应该在 C++11 中起作用。但是,当前的编译器可能仍然存在问题(由于缺乏完全的 C++11 兼容性),例如上面的代码在 g++ 4.6.1 中无法编译

于 2012-02-28T23:09:53.137 回答
1

在 C++03 中,您必须通过非常量引用将字符串流作为参数传递,或者仅返回结果字符串 ( ss.str()),因为您无法复制流。

于 2011-02-25T16:58:11.567 回答
-2

您必须包含sstream并拥有std::stringstream而不是stringstream.

于 2011-02-25T16:45:07.430 回答