Манипуляторы каким-то образом конвертируют тип потока?
Я пытаюсь использовать аноним 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&>(...)
Тогда все работает нормально.
Я не знаю, что, по вашему мнению, сработало, но если оставить ссылку и убрать манипуляторы, это все равно не поможет.