-1

I'm trying to write a generic string parser function by using std::ostringstream class.

#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;
}

I get the following errors for the marked line.

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>>'

What is wrong in my code?

hkBattousai
  • 10,583
  • 18
  • 76
  • 124

1 Answers1

4

basic_ostringstream has operator << not >> http://en.cppreference.com/w/cpp/io/basic_ostringstream

Abstraction
  • 511
  • 2
  • 9