我的代码如下所示:

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>

现在,我在堆栈溢出和其他地方看到了一些类似的问题。这些似乎是处理人们继承了stringstream或其他身份不明的人。就我而言,这应该像将“>>”应用于普通字符串流和char一样简单。为什么这不起作用?

谢谢,
伊恩

最佳答案

我认为该问题是MSVC++如何处理右值的众所周知的错误。在行中

stringstream(line) >> *result;

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

要解决此问题,请将其分为两行:
stringstream stream(line);
stream >> *result;

希望这可以帮助!

关于c++ - 字符串流的歧义重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9958621/

10-09 19:59