Манипуляторы каким-то образом конвертируют тип потока?

Я пытаюсь использовать аноним ostringstream генерировать string: Используйте анонимный поток строк для создания строки

Однако, когда я использую манипуляторы, я не могу больше компилировать:

const auto myString(static_cast<ostringstream>(ostringstream{} << setfill('!') << setw(13) << "lorem ipsum").str());

Но это, кажется, не допускается даже в gcc 5.1:

prog.cpp: в функции int main():
prog.cpp: 8: 109: ошибка: нет соответствующей функции для вызова std::basic_ostringstream<char>::basic_ostringstream(std::basic_ostream<char>&)
const auto myString(static_cast<ostringstream>(ostringstream{} << setfill('!') << setw(13) << "lorem ipsum").str());

В файле из / usr / include / c ++ / 5 / iomanip: 45: 0,
из prog.cpp: 1:
/ usr / include / c ++ / 5 / sstream: 582: 7: примечание: кандидат
std::basic_ostringstream<_CharT, _Traits, _Alloc>::basic_ostringstream(std::basic_ostringstream<_CharT, _Traits, _Alloc>&&)_CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>] basic_ostringstream(basic_ostringstream&& __rhs)

/ usr / include / c ++ / 5 / sstream: 582: 7: примечание: нет известного преобразования для аргумента 1 из std::basic_ostream<char> в std::basic_ostringstream<char>&&
/ usr / include / c ++ / 5 / sstream: 565: 7: примечание: кандидат:
std::basic_ostringstream<_CharT, _Traits, _Alloc>::basic_ostringstream(const __string_type&, std::ios_base::openmode)_CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_ostringstream<_CharT, _Traits, _Alloc>::__string_type = std::basic_string<char>; std::ios_base::openmode = std::_Ios_Openmode] basic_ostringstream(const __string_type& __str,

/ usr / include / c ++ / 5 / sstream: 565: 7: примечание: нет известного преобразования для аргумента 1 из std::basic_ostream<char> в const __string_type& {aka const std::basic_string<char>&}
/ usr / include / c ++ / 5 / sstream: 547: 7: примечание: кандидат:
std::basic_ostringstream<_CharT, _Traits, _Alloc>::basic_ostringstream(std::ios_base::openmode)_CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::ios_base::openmode = std::_Ios_Openmode] basic_ostringstream(ios_base::openmode __mode = ios_base::out)

/ usr / include / c ++ / 5 / sstream: 547: 7: примечание: нет известного преобразования для аргумента 1 из std::basic_ostream<char> в std::ios_base::openmode {aka std::_Ios_Openmode}

Это еще одна ошибка потока gcc или то, что я делаю, на самом деле незаконно?

1

Решение

static_cast<ostringstream>(...)

Это будет пытаться построить новый ostringstream из аргумента в паренсе, std::ostream&, для которого нет конструктора std::ostringstream.

Вы просто хотите привести ссылку обратно к исходному типу. Сделайте приведение к ссылке:

static_cast<ostringstream&>(...)

Тогда все работает нормально.

Я не знаю, что, по вашему мнению, сработало, но не упоминая и убирая манипуляторы, все равно не получается.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector