【问题标题】:Eclipse complains: "Invalid overload of 'endl'" - but code does compileEclipse 抱怨:“'endl' 的重载无效”-但代码确实可以编译
【发布时间】:2013-07-14 12:27:38
【问题描述】:

我为我的模板类编写了一个运算符

template<class T>
std::ostream& operator<<(std::ostream &strm, const MyClass<T> &obj)

当我写作时

cout << myClassInstance << endl;

这编译并运行,但我的 Eclipse CDT 说:

'endl' 的重载无效

为什么会这样告诉我?

(我在 Win7 64bit 上使用 Eclipse CDT Kepler 和 Cygwin gcc)

【问题讨论】:

  • 这可能是一个索引问题。尝试重建索引并检查Window下的索引设置 → PreferencesC/C++Indexer
  • @JesseGood:设置看起来不错,但重新索引没有帮助。
  • 信息不足,无法提供更多帮助。
  • 记住eclipse不能完全解析c++
  • @JesseGood:我遗漏了什么吗?

标签: c++ templates operator-overloading eclipse-cdt


【解决方案1】:

我也遇到了这个错误。

//print the value
cout << rt->element << endl;

一个简单的改变:

//print the value
cout << rt->element;
cout << endl;

为我消除了错误。 C++ 新手,但您似乎还需要为 myClassInstance 重载

【讨论】:

  • 正确,元素的类需要重载operator&lt;&lt;()
【解决方案2】:

这确实是 Eclipse CDT(更具体地说是 Eclipse 的代码分析工具 CODAN)的一个错误。有 bug 报告,它一直是 fixed,应该可以从 2014 年 2 月到期的 CDT 8.3.0 获得。

【讨论】:

  • 我正在运行 CDT 8.4,但仍然遇到此问题。
  • 8.4.0.201406111759 中的同样问题
  • 8.5 中同样的问题,非常烦人。
  • 2017 年还在!
  • 几乎在 2018 年,但仍然... :(
【解决方案3】:

问题出在(据我所知)Eclipse 的代码分析工具。

如果您愿意,可以通过完全禁用无效重载检查来避免此消息:

  1. 打开首选项窗口(从主菜单 Window\Preferences 中)
  2. 转到 C/C++ -> 代码分析
  3. 在右侧窗格中查看“语法和语义错误”| “无效的重载”
  4. 取消选中复选框
  5. 按确定

然后你会看到错误消失了。

但是它可能会跳过真正的错误,最好让它保持选中状态,但使用“自定义所选”按钮来更改其严重性级别。

我已将其更改为“警告”而不是“错误”。

正如@plasmaHH 所说,我认为 Eclipse 在这种情况下无法正确解析 C++。

【讨论】:

    【解决方案4】:

    您可以尝试在以下行中添加评论// @suppress("Invalid overload")

    cout << "SOME TEXT" << endl; // @suppress("Invalid overload")
    

    这将抑制该问题,保持检测代码中其他可能的无效重载的能力。

    顺便说一句,如果您单击编辑器左侧的错误,Eclipse 会为您执行此操作。 (日食:氧气)。

    【讨论】:

    • 好消息!但它对我的协作项目没有用处,因为它在某种程度上污染了不使用 Eclipse 的人的代码。
    【解决方案5】:

    我知道这是一个老问题,但我在 Ubuntu 16.04 LTS 上遇到了与 Eclipse Neon ( v4.6.0 ) 类似的问题

    我的代码是:

    stringstream l_Buffer;
    l_Buffer << "test" << endl;
    const char* l_Temp = l_Buffer.str().c_str();
    

    eclipse报3个错误:

    • “endl”重载无效
    • 无法解析方法“c_str”
    • 无法解析方法“str”

    我尝试了一堆东西,重建索引,弄乱代码分析工具(配置它的方式与我的构建相同),然后写 std::endl... 都无济于事。

    在我的案例中解决所有三个错误的方法是替换

    stringstream l_Buffer;
    

    与:

    basic_stringstream<char> l_Buffer;
    

    注意:Ctrl + 单击stringstream 会引导您进入iosfwd.h 中的typedef 定义,即:

    /// Class for @c char mixed input and output memory streams.
    typedef basic_stringstream<char>    stringstream;
    

    【讨论】:

    • 请把它变成一个新问题(并在文章中链接到这个问题)。
    【解决方案6】:

    尽管这是一个老问题,但对于未来的访问者来说,让错误消失的事情只是使用完全限定的 cout 和 endl:

    std::cout << thing << std::endl
    

    不知道为什么 Eclipse 会在那里抱怨,因为它在代码中的特定位置没有命名空间的情况下编译和运行良好。

    【讨论】:

      【解决方案7】:

      尝试使用 std::endl 而不是 endl 或在您的班级中作为成员重载:

      template<class T>
      MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
        std::cout << f;
        return *this;
      }
      

      【讨论】:

      • 我不是在寻求避免该消息的建议,而是寻求解释为什么会发生这种情况......
      【解决方案8】:

      当我升级 Eclipse 时,这种情况一直发生在我身上。它具有Member declaration not foundinvalid overload of endlInvalid arguments ... 的所有奇怪错误。现在我发现这是工作区中的信息,而旧项目对于新的 CDT 代码段不是最新的。

      对于在升级 eclipse 或将工作区复制到新平台后遇到同样问题的人。其实很容易解决:Project-&gt;C/C++ index-&gt;Rebuild。完成后,所有奇怪的错误都会消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2017-01-17
        • 1970-01-01
        相关资源
        最近更新 更多