Eclipse 报错:"Invalid overload of 'endl'" - 但代码可以编译

23

我已经为我的模板类写了一个运算符<<:

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)


这可能是一个索引问题。尝试重建索引并检查Window → PreferencesC/C++Indexer下的索引设置。 - Jesse Good
2
@JesseGood:设置看起来没问题,重新索引也没有帮助。 - einpoklum
没有足够的信息来提供更多帮助。 - Jesse Good
请记住,Eclipse无法完全解析C++。 - PlasmaHH
在使用MinGW编译器在Eclipse中编译C++代码时,我遇到了相同的错误。然而,当我在控制台上使用MinGW的C++编译器(4.8.1)进行编译时,我没有遇到任何错误。所以这应该是Jesse Good所说的索引问题。 - phoad
显示剩余4条评论
8个回答

14
问题在于(据我所知)Eclipse的代码分析工具有问题。
如果您愿意,可以通过完全禁用检查无效重载来避免此消息:
  1. 打开首选项窗口(从主菜单“Window\Preferences”中)
  2. 转到C/C++ -> 代码分析
  3. 在右侧窗格中查看“语法和语义错误” | “无效的重载”
  4. 取消复选框
  5. 按OK
然后您会发现该错误已消失。
但是可能会跳过真正的错误,最好让它保持选中状态,但使用“自定义选择”按钮更改其严重程度级别。
我已将其更改为“警告”,而不是“错误”。
正如@plasmaHH所说,我认为在这种情况下Eclipse无法正确解析C++。

13

我也遇到了这个错误。

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

简单更改为:

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

帮我解决了错误。虽然我是C++的新手,但似乎你还需要为myClassInstance重载<<运算符,如果你想使用原始方法。


1
正确的做法是,元素的类需要重载 operator<<() - Brandlingo

12

这确实是Eclipse CDT(更具体地说是Eclipse的代码分析工具CODAN)存在的一个漏洞。已经有漏洞报告,并且已经被修复,应该从CDT 8.3.0起可用,该版本预计于2014年2月发布。


7
我正在运行CDT 8.4,但仍然遇到这个问题。 - MrMas
1
在8.4.0.201406111759版本中出现了相同的问题。 - Yaroslav Bulatov
1
8.5版本也有同样的问题,非常烦人。 - vsoftco
4
2017年仍然存在! - Rexcirus
1
快到2018年了,但还是... :( - waas1919
仍然在版本:2021-12(4.22.0)中看到相同的内容。 - sancho.s ReinstateMonicaCellio

2
您可以尝试在以下行中添加注释// @suppress("Invalid overload")
cout << "SOME TEXT" << endl; // @suppress("Invalid overload")

这将抑制该问题,同时仍然保留检测代码中其他可能的无效过载的能力。
顺便说一下,如果您在编辑器左侧单击错误,Eclipse会为您执行此操作。(Eclipse:Oxygen)。

不错的信息!但对于我的协作项目来说并不实用,因为它会让那些不使用Eclipse的人感到有些困扰。 - sancho.s ReinstateMonicaCellio

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 + 单击 stringstream 会导航到其在 iosfwd.h 中的 typedef 定义,如下所示:
/// Class for @c char mixed input and output memory streams.
typedef basic_stringstream<char>    stringstream;

请将此转化为一个新问题(并在写作中链接到此问题)。 - einpoklum

0
尝试使用std::endl而不是endl,或者在您的类中作为成员进行重载:
template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
  std::cout << f;
  return *this;
}

我并不是在寻求如何避免该消息的建议,而是要求解释为什么会发生这种情况... - einpoklum

0
每次我升级Eclipse时,都会发生这种情况。它会出现所有奇怪的错误,如“成员声明未找到”、“endl的无效重载”、“无效参数...”。现在我发现,这是工作区中的信息和旧项目没有更新到新的CDT Codan。
对于那些在升级Eclipse或将工作区复制到新平台后遇到相同问题的人来说,解决方法实际上非常简单:项目->C/C++索引->重建。完成后,所有奇怪的错误都会消失。

0

尽管这是一个老问题,但对于未来的访问者,让错误消失的方法就是简单地使用完全限定的cout和endl:

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

不确定为什么Eclipse在那里抱怨,因为在代码的那个特定位置没有命名空间时,它可以编译和运行得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接