nixp.ru v3.0

20 января 2017,
пятница,
21:08:10 MSK

DevOps с компанией «Флант»
decvar написал 14 августа 2006 года в 17:50 (466 просмотров) Ведет себя как мужчина; открыл 111 тему в форуме, оставил 1838 комментариев на сайте.

есть такой код:

SwatLogger& operator <<(std::ostream& (*f)(std::ostream &)) {
            if (f != std::endl )
                  if (log) log << f;
                  else std::clog << f;
            else {      
                  time_t now = time(0);
                  std::string str(ctime(&now));
                  str.replace(str.find('\n'), 1, "");
                  sstr << '\0';
                  std::string strbuf = sstr.str();
                  std::cout << label[sev] << " " << strbuf << f;
                  if (log)
                        log << str << label[sev] << " " << strbuf << f;
                  else
                        std::clog << str << label[sev] << " " << strbuf << f;
                  
                  sstr.freeze(false);
                  sstr.clear();
                  sstr.seekp(0);
                  sev = sev_trace;
            }
            
            return *this;
      }

g++ 3.4 на него ругается так:

../include/SwatLogger.h:52: error: assuming cast to type `std::basic_ostream >&(*)(std::basic_ostream >&)' from overloaded function

что вообщем-то полный бред…

в результате ничего кроме как вот такой изъебской конструкции не придумал:

std::ostream& (*pEndl)(std::ostream &) = &(std::endl);
if (f != pEndl )
...

То что я написал — суть подпорка.

Вопрос: кто не прав? я или g++ ????

Longobard

Забавно, я всегда думал что конвертация между std::ostream и std::basic_ostream происходит без поблем. Кста, а ostream случайно не потомок basic_ostream-а?

decvar

должен быть

myst

слушай, судя по

std::ostream& (*f)(std::ostream &)

f — указатель на функцию, которая возвращает ostream и получает ostream. Тогда тут

if (f != std::endl)

ты её странно вызываешь…

decvar

твои предложения?

myst

ну я так понимаю функцию надо вызывать как

f(<параметры>)
decvar

void f(void)

myst

что void f(void)? у тебя параметром в твой логгер, что передаётся? указатель на функцию, вот посмотри какие у неё параметры…

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.