stringstream的模糊过载

ima*_*ett 3 c++ string templates stringstream

我的代码看起来像:

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

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>
Run Code Online (Sandbox Code Playgroud)

现在,我在Stack Overflow和其他地方看到过类似的问题.这些似乎涉及人们继承字符串流或其他狡猾.就我而言,这应该就像将">>"应用于普通的stringstream和char一样简单?为什么这不起作用?

谢谢,
伊恩

tem*_*def 5

我认为这个问题是MSVC++如何处理rvalues的一个众所周知的错误.在线

stringstream(line) >> *result;
Run Code Online (Sandbox Code Playgroud)

您正在创建一个临时stringstream对象,然后operator >>在其上进行调用.如果operator >>是自由函数,则其签名可能通过引用获取流参数.但是,临时对象(如您在此构建的对象)无法通过引用传递.Visual Studio允许您执行此操作,即使C++规范不允许这样做,这就是为什么它在MSVC中有效,但g ++不允许这样做.

要解决此问题,请将其拆分为两行:

stringstream stream(line);
stream >> *result;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!