Я пытаюсь использовать аноним 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 или то, что я делаю, на самом деле незаконно?
static_cast<ostringstream>(...)
Это будет пытаться построить новый ostringstream
из аргумента в паренсе, std::ostream&
, для которого нет конструктора std::ostringstream
.
Вы просто хотите привести ссылку обратно к исходному типу. Сделайте приведение к ссылке:
static_cast<ostringstream&>(...)
Тогда все работает нормально.
Я не знаю, что, по вашему мнению, сработало, но не упоминая и убирая манипуляторы, все равно не получается.
Других решений пока нет …