LINUX.ORG.RU

[C++, stringstream] std::ios_base::fmtflags против std::fmtflags


0

0

В ios_base.h флаги формата ввода/вывода определены в классе std::ios_base::. А std::stringstream (зараза) желает, чтобы в его оператор >> флаги формата подавались из std:: (насколько я понял). Как можно забороть эту проблему?

★★★

Последнее исправление: one_more_hokum (всего исправлений: 1)

Ответ на: комментарий от lester
#include <string>
#include <sstream>
#include <iostream>
//--------------------------------------------------------------
template <typename T>
class StrToValue
{
private:
 typedef std::ios_base::fmtflags fmtflags;
 T t;
 std::string str;
 fmtflags bf;
public:
 StrToValue(const std::string& istr,const fmtflags& ibf)
  : str(istr),bf(ibf)
 { return; }
 inline operator T ()
 {
  std::stringstream sstr(str);
  sstr>>bf>>t;
  if(sstr.fail()) { /* Тут я исключение кидаю, но в примере убрал */ return T(); }
  return t;
 }
};
//--------------------------------------------------------------
int main(int argc,char** argv)
{
 return 0;
}

Ошибка такая:

In member function 'StrToValue<T>::operator T()':

error: no match for 'operator>>' in 'sstr >> ((StrToValue<T>*)this)->StrToValue<T>::bf'

note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]

И ещё штук дцать таких note.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

std::ios_base::fmtflags - это флаги. А в std находятся манипуляторы. То что вы хотите выглядит вот так:

#include <string>
#include <sstream>
#include <iostream>
//--------------------------------------------------------------
template <typename T>
class StrToValue
{
private:
 typedef std::ios_base& (*man)(std::ios_base& );
 T t;
 std::string str;
 man bf;
public:
 StrToValue(const std::string& istr,const man ibf)
  : str(istr),bf(ibf)
 { return; }
 inline operator T ()
 {
  std::stringstream sstr(str);
  sstr>>bf>>t;
  if(sstr.fail()) { /* Тут я исключение кидаю, но в примере убрал */ return T(); }
  return t;
 }
};
//--------------------------------------------------------------
int main(int argc,char** argv)
{
	StrToValue<int> v1("123",std::hex);
	std::cout<<v1<<std::endl;
 return 0;
}

platerx
()
Ответ на: комментарий от platerx

> в std находятся манипуляторы

Спасибо большое, вопрос закрыт.

one_more_hokum ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.