Перегрузка endl проблема компиляции в GNU g++ 4.9.2
У меня проблема с компиляцией следующего фрагмента кода при использовании GNU g++ 4.9.2 (используется для компиляции нормально в g++ 2.95.3)
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] ^
Пожалуйста, руководство / помощь.
2 ответа
Решение
Выберите перегрузку 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';
}
std::endl
шаблон функции, вам нужно указать аргументы шаблона. Потому что вы используете std::ostream
(т.е. basic_ostream<char>
) вы могли бы
if (f == endl<char, std::char_traits<char>>)