Возврат потока строки из функции - PullRequest
11 голосов
/ 25 февраля 2011

Понятно, что здесь я пропускаю что-то важное о строковых потоках в целом, но кто-то может объяснить, почему

#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 

Как правильно вернуть поток строк из функции? (редактировать: добавлены заголовки для полного фрагмента кода и исправлена ​​опечатка)

Ответы [ 6 ]

19 голосов
/ 25 февраля 2011

После исправления type-o в типе возвращаемого значения (отмеченного Mahesh) ваш код не будет компилироваться в C ++ 03, потому что stringstream не копируется. Однако, если ваш компилятор поддерживает C ++ 0x, включение этого параметра позволяет компилировать ваш код, поскольку stringstream равно MoveConstructible.

12 голосов
/ 25 февраля 2011

Вы не можете вернуть поток из функции по значению, потому что это означает, что вам нужно скопировать поток. Потоки C ++ не копируются.

3 голосов
/ 19 апреля 2016

Старый вопрос, но я считаю, что правильный способ достичь желаемого - использовать метод stringstream :: str , который возвращает строковый объект с копией текущего содержимого в буфер потока. 1003 *

Вот пример с 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 
3 голосов
/ 29 февраля 2012

Хотя это не работает в C ++ 03, оно должно работать в C ++ 11. Однако современные компиляторы могут все еще иметь проблемы (из-за отсутствия полной совместимости с C ++ 11), например приведенный выше код не скомпилируется в g ++ 4.6.1

2 голосов
/ 25 февраля 2011

В C ++ 03 вам придется либо передавать поток строк в качестве параметра по неконстантной ссылке, либо возвращать только результирующую строку (ss.str()), поскольку вы не можете скопировать поток.

0 голосов
/ 25 февраля 2011

Вы должны включить sstream и иметь std::stringstream вместо stringstream.

...