Eclipse抱怨:"Invalid overload of 'endl'" - 但代码确实可以编译

Eclipse complains: "Invalid overload of 'endl'" - but code does compile

本文关键字:代码 编译 of overload 抱怨 endl Eclipse Invalid      更新时间:2023-10-16

我写了一个运算符<lt;对于我的模板类:

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

当我写时

cout << myClassInstance << endl;

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

"endl"的过载无效

为什么它告诉我?

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

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

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

  1. 打开"首选项"窗口(从主菜单"窗口\首选项")
  2. 转到C/C++->代码分析
  3. 在右侧窗格中,请参阅"语法和语义错误"|"无效重载"
  4. 取消选中复选框
  5. 按OK

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

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

我已将其更改为"警告",而不是"错误"。

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

我也收到了这个错误。

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

一个简单的改变:

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

为我删除了错误。C++新手,但似乎你也需要重载<lt;对于myClassInstance。如果要使用原始方法。

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

您可以尝试添加注释// @suppress("Invalid overload"),如下行所示:

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

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

顺便说一句,如果你点击编辑器左侧的bug,Eclipse就会帮你完成。(Eclipse:氧气)。

我知道这是一个老问题,但我在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;

尽管这是一个老问题,但对于未来的访问者来说,让我忘记错误的是简单地使用完全合格的cout和endl:

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

不知道Eclipse为什么会抱怨,因为它在代码中没有命名空间的情况下编译和运行得很好。

尝试放置std::endl而不是endl或者作为会员在你的班级内超载:

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

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

因为有些人在升级eclipse或将工作区复制到新平台后也有同样的问题。它实际上很容易解决:Project->C/C++ index->Rebuild。完成后,所有奇怪的错误都会消失。