23

我为我的模板类编写了一个 operator<<:

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

当我写

cout << myClassInstance << endl;

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

'endl' 的无效重载

为什么它告诉我?

(我在带有 Cygwin gcc 的 Win7 64 位上使用 Eclipse CDT Kepler)

4

8 回答 8

13

我也收到了这个错误。

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

一个简单的改变:

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

为我删除了错误。C++ 新手,但您似乎还需要为 myClassInstance 重载 <<。如果要使用原始方法。

于 2013-09-17T00:29:04.607 回答
12

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

于 2014-02-16T03:39:30.103 回答
11

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

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

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

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

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

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

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

于 2013-10-20T03:53:19.277 回答
2

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

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

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

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

于 2018-06-08T10:26:33.737 回答
1

我知道这是一个老问题,但我在 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 + Clickingstringstream将引导您进入其 typedef 定义,iosfwd.h其中:

/// Class for @c char mixed input and output memory streams.
typedef basic_stringstream<char>    stringstream;
于 2016-07-07T13:59:07.850 回答
0

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

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

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

于 2014-10-30T10:21:51.870 回答
0

尝试将 std::endl 而不是 endl 或重载放在你的类中作为成员:

template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
  std::cout << f;
  return *this;
}
于 2014-10-30T10:41:14.607 回答
0

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

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

于 2015-07-04T08:55:56.417 回答