Hooked
Hooked

Reputation: 88158

Return stringstream from a function

Clearly I am missing something important about stringstreams in general here, but could someone explain why

#include <sstream>
using namespace std;

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

Fails with

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 

How does one return a stringstream from a function properly? (edit: added the headers for a complete code snippet and fixed typo)

Upvotes: 13

Views: 26750

Answers (6)

BugShotGG
BugShotGG

Reputation: 5190

Old question but I believe that the correct way to achieve what you want is to use the stringstream::str method that returns a string object with a copy of the current contents in the stream buffer.

Here is an example with 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;
}

which prints:

add whatever you want to the stream 12 13.4 

Upvotes: 7

vmpstr
vmpstr

Reputation: 5211

You have to include sstream and have std::stringstream instead of stringstream.

Upvotes: -2

user1239014
user1239014

Reputation: 111

While it does not work in C++03, it should work in C++11. However, current compilers may still have problems (due to the lack of full C++11 compatibility), e.g. the above code will not compile in g++ 4.6.1

Upvotes: 3

Mark B
Mark B

Reputation: 96241

In C++03 you'll have to either pass the stringstream as a parameter by non-const reference or return just the resulting string (ss.str()), as you can't copy the stream.

Upvotes: 1

Howard Hinnant
Howard Hinnant

Reputation: 218780

After correct the type-o in the return type (noted by Mahesh), your code will not compile in C++03 because stringstream is not copyable. However if your compiler supports C++0x, turning that on allows your code to compile because stringstream is MoveConstructible.

Upvotes: 19

wilhelmtell
wilhelmtell

Reputation: 58677

You can't return a stream from a function by value, because that implies you'd have to copy the stream. C++ streams are not copyable.

Upvotes: 13

Related Questions