"std::stringstream::operator>>()"无法欺骗模板类型

`std::stringstream::operator>>()` cannot decude the template type

本文关键字:gt 欺骗 类型 stringstream std operator      更新时间:2023-10-16

我正在尝试使用std::ostringstream类编写一个通用的字符串解析器函数。

#include <iostream>
#include <sstream>
#include <string>
template <class ValueType, class CharType>
ValueType parse_string(const std::basic_string<CharType> & String)
{
    std::basic_ostringstream<CharType> oss(String);
    ValueType Value;
    oss >> Value;   // ERROR HERE!
    return Value;
}
int wmain(int argc, wchar_t *argv[]/*, wchar_t *envp[]*/)
{
    const std::string SString("3.14");
    std::cout << "SString : " << SString << std::endl;
    std::cout << "int     : " << parse_string<int>(SString) << std::endl;
    std::cout << "double  : " << parse_string<double>(SString) << std::endl;
    const std::wstring WString(L"2.718");
    std::wcout << L"WString : " << WString << std::endl;
    std::wcout << L"int     : " << parse_string<int>(WString) << std::endl;
    std::wcout << L"double  : " << parse_string<double>(WString) << std::endl;
    return 0;
}

我得到了以下标记线的错误。

Error   C2676   binary '>>': 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>' does not define this operator or a conversion to a type acceptable to the predefined operator
Error   C2678   binary '>>': no operator found which takes a left-hand operand of type 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>' (or there is no acceptable conversion)
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,_Elem *)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,_Elem &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,signed char *)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,signed char &)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,unsigned char *)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,unsigned char &)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &&,_Ty &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &&' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &&' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>'
Error   C2676   binary '>>': 'std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char>>' does not define this operator or a conversion to a type acceptable to the predefined operator
Error   C2678   binary '>>': no operator found which takes a left-hand operand of type 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>' (or there is no acceptable conversion)
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,_Elem *)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,_Elem &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,signed char *)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,signed char &)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,unsigned char *)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<char,_Traits> &std::operator >>(std::basic_istream<char,_Traits> &,unsigned char &)': could not deduce template argument for 'std::basic_istream<char,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &&,_Ty &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &&' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &&,std::basic_string<_Elem,_Traits,_Alloc> &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &&' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'
Error   C2784   'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)': could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>'

我的代码出了什么问题?

basic_ostringstream具有运算符<<而非>>http://en.cppreference.com/w/cpp/io/basic_ostringstream