【问题标题】:Overloading endl compilation issue in GNU g++ 4.9.2在 GNU g++ 4.9.2 中重载 endl 编译问题
【发布时间】:2016-10-08 14:49:01
【问题描述】:

我在使用 GNU g++ 4.9.2 编译以下代码 sn-p 时遇到问题(用于在 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]                 ^

请指导/帮助。

【问题讨论】:

  • 注意:为避免遇到此类问题,您可以编写一个 XOStreamBuffer 并将其附加到 XOStream(几乎未更改的 ostream)
  • 那么,你为什么不让endl 做它的事呢?因为您想在XOStream 级别而不是ostr 级别拦截flush?您也可以直接将else 简化为return f(ostr);...我想如果它也在做类似的黑客攻击,那是行不通的。

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


【解决方案1】:

static_cast选择std::endl的重载:

#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';
}

【讨论】:

  • static_cast&lt;decltype(f)&gt;
【解决方案2】:

std::endl是函数模板,需要指定模板参数。因为您使用的是std::ostream(即basic_ostream&lt;char&gt;),所以您可以

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

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2013-12-15
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    相关资源
    最近更新 更多