重载GNU g ++ 4.9.2中的endl编译问题

时间:2016-06-08 11:05:03

标签: c++ c++11 g++ ostream endl

在使用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 个答案:

答案 0 :(得分: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 :(得分:2)

std::endl是一个函数模板,您需要指定模板参数。因为您正在使用std::ostream(即basic_ostream<char>),所以

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