我的代码看起来像这样:
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>现在,我在Stack Overflow和其他地方看到了一些类似的问题。这些似乎是在处理人们对stringstream或其他不可靠的行为进行子类化。就我而言,这应该和将">>“应用于普通字符串流和字符一样简单?为什么这不起作用?
谢谢,
伊恩
发布于 2012-04-01 02:45:29
我认为这个问题是MSVC++如何处理rvalue的一个众所周知的错误。在队伍中
stringstream(line) >> *result;您正在创建一个临时stringstream对象,然后对其调用operator >>。如果operator >>是一个自由函数,则其签名可能通过引用获取流参数。但是,像您在这里构造的临时对象不能通过引用传递。Visual Studio允许您这样做,尽管C++规范不允许这样做,这就是为什么这在g++中有效,但Visual Studio不允许这样做。
要解决此问题,请将其拆分为两行:
stringstream stream(line);
stream >> *result;希望这能有所帮助!
https://stackoverflow.com/questions/9958621
复制相似问题