c++ - Converting strings to pointers -
i'm trying convert pointer string, , string pointer (lexical casting) using following code. conversion pointer string works fine, not other way round.
why happen? there other way can convert string pointer?
i'm not worried errors caused incorrect format of string. string i'm trying convert pointer generated converting pointer string.
here's code:
//tb_converttostring.cpp #include<iostream> #include<cstdio> #include<sstream> #include<string> //functions convert data types , strings template <typename t> std::string tostring ( t number ) { std::stringstream ss; ss << number; return ss.str(); }; template <typename t> t fromstring ( const std::string &text ) { std::stringstream ss(text); t result; ss >> result; return result; } //------------------------------------------------- using namespace std; int main() { int =10; int* p1 = &a; // works------------ string s1 = tostring<int *>(p1); printf("\n ptr: %s",s1.c_str()); //---------------------- //this gives compilation errors ----- //int * p2 = fromstring<int *>(s1); //printf("\n ptr: %p",p2); //---------------------- cout<<"\n\n"; return 0; };
un-commenting problem section gives following compilation errors:
nehak@marvin:~/desktop$ g++ tb_converttostring.cpp tb_converttostring.cpp: in function ‘t fromstring(const string&) [with t = int*, std::string = std::basic_string<char>]’: tb_converttostring.cpp:39:33: instantiated here tb_converttostring.cpp:21:2: error: no match ‘operator>>’ in ‘ss >> result’ tb_converttostring.cpp:21:2: note: candidates are: /usr/include/c++/4.6/istream:122:7: note: 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>] /usr/include/c++/4.6/istream:122:7: note: no known conversion argument 1 ‘int*’ ‘std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}’ /usr/include/c++/4.6/istream:126: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>] /usr/include/c++/4.6/istream:126:7: note: no known conversion argument 1 ‘int*’ ‘std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}’ /usr/include/c++/4.6/istream:133:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:133:7: note: no known conversion argument 1 ‘int*’ ‘std::ios_base& (*)(std::ios_base&)’ /usr/include/c++/4.6/istream:169:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(bool&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:169:7: note: no known conversion argument 1 ‘int*’ ‘bool&’ /usr/include/c++/4.6/istream:173:7: note: std::basic_istream<_chart, _traits>& std::basic_istream<_chart, _traits>::operator>>(short int&) [with _chart = char, _traits = std::char_traits<char>] /usr/include/c++/4.6/istream:173:7: note: no known conversion argument 1 ‘int*’ ‘short int&’ /usr/include/c++/4.6/istream:176:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(short unsigned int&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:176:7: note: no known conversion argument 1 ‘int*’ ‘short unsigned int&’ /usr/include/c++/4.6/istream:180:7: note: std::basic_istream<_chart, _traits>& std::basic_istream<_chart, _traits>::operator>>(int&) [with _chart = char, _traits = std::char_traits<char>] /usr/include/c++/4.6/istream:180:7: note: no known conversion argument 1 ‘int*’ ‘int&’ /usr/include/c++/4.6/istream:183:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(unsigned int&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:183:7: note: no known conversion argument 1 ‘int*’ ‘unsigned int&’ /usr/include/c++/4.6/istream:187:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(long int&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:187:7: note: no known conversion argument 1 ‘int*’ ‘long int&’ /usr/include/c++/4.6/istream:191:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(long unsigned int&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:191:7: note: no known conversion argument 1 ‘int*’ ‘long unsigned int&’ /usr/include/c++/4.6/istream:196:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(long long int&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:196:7: note: no known conversion argument 1 ‘int*’ ‘long long int&’ /usr/include/c++/4.6/istream:200:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(long long unsigned int&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:200:7: note: no known conversion argument 1 ‘int*’ ‘long long unsigned int&’ /usr/include/c++/4.6/istream:205:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(float&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:205:7: note: no known conversion argument 1 ‘int*’ ‘float&’ /usr/include/c++/4.6/istream:209:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(double&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:209:7: note: no known conversion argument 1 ‘int*’ ‘double&’ /usr/include/c++/4.6/istream:213:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(long double&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:213:7: note: no known conversion argument 1 ‘int*’ ‘long double&’ /usr/include/c++/4.6/istream:217:7: note: std::basic_istream<_chart, _traits>::__istream_type& std::basic_istream<_chart, _traits>::operator>>(void*&) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__istream_type = std::basic_istream<char>] /usr/include/c++/4.6/istream:217:7: note: no known conversion argument 1 ‘int*’ ‘void*&’ /usr/include/c++/4.6/istream:241:7: note: std::basic_istream<_chart, _traits>& std::basic_istream<_chart, _traits>::operator>>(std::basic_istream<_chart, _traits>::__streambuf_type*) [with _chart = char, _traits = std::char_traits<char>, std::basic_istream<_chart, _traits>::__streambuf_type = std::basic_streambuf<char>] /usr/include/c++/4.6/istream:241:7: note: no known conversion argument 1 ‘int*’ ‘std::basic_istream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}’ /usr/include/c++/4.6/bits/basic_string.tcc:998:5: note: template<class _chart, class _traits, class _alloc> std::basic_istream<_chart, _traits>& std::operator>>(std::basic_istream<_chart, _traits>&, std::basic_string<_chart, _traits, _alloc>&) /usr/include/c++/4.6/bits/istream.tcc:957:5: note: template<class _chart2, class _traits2> std::basic_istream<_chart, _traits>& std::operator>>(std::basic_istream<_chart, _traits>&, _chart2*) /usr/include/c++/4.6/bits/istream.tcc:925:5: note: template<class _chart, class _traits> std::basic_istream<_chart, _traits>& std::operator>>(std::basic_istream<_chart, _traits>&, _chart&) /usr/include/c++/4.6/istream:709:5: note: template<class _traits> std::basic_istream<char, _traits>& std::operator>>(std::basic_istream<char, _traits>&, unsigned char&) /usr/include/c++/4.6/istream:714:5: note: template<class _traits> std::basic_istream<char, _traits>& std::operator>>(std::basic_istream<char, _traits>&, signed char&) /usr/include/c++/4.6/istream:756:5: note: template<class _traits> std::basic_istream<char, _traits>& std::operator>>(std::basic_istream<char, _traits>&, unsigned char*) /usr/include/c++/4.6/istream:761:5: note: template<class _traits> std::basic_istream<char, _traits>& std::operator>>(std::basic_istream<char, _traits>&, signed char*) nehak@marvin:~/desktop$
the problem type of pointer can implicit cast void*
, void*
can not cast type of pointer. in case should specialize fromstring
function pointers. this
template <typename t> t fromstring ( const std::string &text, std::enable_if< ! std::is_pointer< t >::value >::type * = nullptr ) { std::stringstream ss(text); t result; ss >> result; return result; } template <typename t> t fromstring ( const std::string &text, std::enable_if< std::is_pointer< t >::value >::type * = nullptr ) { std::stringstream ss(text); void * result; ss >> result; return (t)result; }
Comments
Post a Comment