Неоднозначная перегрузка для струнного потока - PullRequest
3 голосов
/ 31 марта 2012

Мой код выглядит примерно так:

template <typename type> void deserialize_element(type* result) {
    //...
    if /*...*/
    else stringstream(line) >> *result;
}

MSVC компилируется без проблем, но GCC выдает:

    error: ambiguous overload for 'operator>>' in 'std::basic_stringstream<char>(((const std::basic_stringstream<char>::__string_type&)((const std::basic_stringstream<char>::__string_type*)(& line))), std::operator|((std::_Ios_Openmode)16u, (std::_Ios_Openmode)8u)) >> * result'
    /usr/include/c++/4.5/istream:120:7: note: candidates are: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] <near match>
    /usr/include/c++/4.5/istream:124:7: note:                 std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] <near match>

Теперь я видел несколько подобных вопросов здесь о переполнении стекаи в других местах.Похоже, что они имеют дело с людьми, подклассами струнного потока или других хитрости.Насколько я понимаю, это должно быть так же просто, как применить ">>" к обычному потоку строк и символу?Почему это не работает?

Спасибо,Ian

1 Ответ

5 голосов
/ 31 марта 2012

Я думаю, что проблема заключается в том, что MSVC ++ обрабатывает значения. В строке

stringstream(line) >> *result;

Вы создаете временный объект stringstream, затем вызываете operator >> для него. Если operator >> является свободной функцией, ее сигнатура, вероятно, принимает параметр потока по ссылке. Тем не менее, временные объекты, такие как тот, что вы создали здесь, не могут быть переданы по ссылке. Visual Studio позволяет вам делать это, даже если это не разрешено спецификацией C ++, поэтому это работает в MSVC, но g ++ не позволяет этого.

Чтобы это исправить, разбейте это на две строки:

stringstream stream(line);
stream >> *result;

Надеюсь, это поможет!

...