2016-06-08 8 views
1

У меня проблема при составлении следующего фрагмента кода при использовании GNU г ++ 4.9.2 (используется для компиляции ОК в г ++ 2.95.3)Перегрузки вопрос епсИ компиляции в GNU г ++ 4.9.2

XOStream &operator<<(ostream &(*f)(ostream &)) { 
     if(f == std::endl) { 
       *this << "\n" << flush; 
     } 
     else { 
       ostr << f; 
     } 
     return(*this); 
} 

Ошибка такова, как показано ниже:

error: assuming cast to type 'std::basic_ostream<char>& (*)(std::basic_ostream<char>&)' from overloaded function [-fpermissive] 
    [exec] if(f == std::endl) { 
    [exec]    ^

Пожалуйста, помогите.

+0

Примечание: Для того, чтобы избежать запуска в такого рода проблемы, вы можете написать XOStreamBuffer и присоедините его к XOStream (практически без изменений) –

+0

Итак, почему вы не просто позволяете 'endl' делать свою работу? Потому что вы хотите перехватить 'flush' на уровне' XOStream', а не на уровне 'ostr'? Вы также можете упростить 'else', чтобы' return f (ostr); 'непосредственно ... Я предполагаю, что если он тоже делает подобный взлом, это не сработает. – Yakk

ответ

3

Выберите перегрузку std::endl с static_cast:

#include <iostream> 
#include <iomanip> 

inline bool is_endl(std::ostream &(*f)(std::ostream &)) { 
    // return (f == static_cast<std::ostream &(*)(std::ostream &)>(std::endl)); 
    // Even nicer (Thanks M.M) 
    return (f == static_cast<decltype(f)>(std::endl)); 
} 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << is_endl(std::endl) << '\n'; 
    std::cout << is_endl(std::flush) << '\n'; 
} 
+1

или 'static_cast ' –

2

std::endl - это шаблон функции, необходимо указать аргументы шаблона. Потому что вы используете std::ostream (т.е. basic_ostream<char>) можно

if (f == endl<char, std::char_traits<char>>)