Eclipse抱怨:“'endl'的重载无效” - 但代码确实编译了

时间:2013-07-16 10:49:51

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

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

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)

8 个答案:

答案 0 :(得分:13)

我也遇到了这个错误。

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

一个简单的改动:

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

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

答案 1 :(得分:12)

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

答案 2 :(得分:11)

问题是(据我所知)使用Eclipse的代码分析工具。

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

  1. 打开首选项窗口(从主菜单Window \ Preferences)
  2. 转到C / C ++ - &gt;代码分析
  3. 在右侧窗格中,请参阅“语法和语义错误” “无效过载”
  4. 取消选中复选框
  5. 按OK
  6. 然后你会看到错误消失了。

    然而,它可能会跳过真正的错误,最好让它保持检查状态,但使用“Customize Selected”按钮更改其严重性级别。

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

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

答案 3 :(得分: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个错误:

  • &lt; endl&#39;
  • 的重载无效
  • 方法&#39; c_str&#39;无法解决
  • 方法&#39; str&#39;无法解决

我尝试了很多东西,重建索引,搞乱代码分析工具(以与构建方式相同的方式配置它),然后编写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;

答案 4 :(得分:1)

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

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

这将抑制该问题,仍然能够在代码中的某处检测其他可能的无效重载。

顺便说一句,如果你点击编辑器左侧的bug,Eclipse会为你做这件事。 (日食:氧气)。

答案 5 :(得分:0)

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

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

不确定为什么Eclipse会在那里抱怨,因为它在代码中的特定位置编译并运行没有名称空间。

答案 6 :(得分:0)

尝试使用std :: endl而不是endl 或作为成员在你的班级内超载:

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

答案 7 :(得分:0)

当我升级日食时,这种情况一直发生在我身上。它有Member declaration not foundinvalid overload of endlInvalid arguments ...的所有奇怪错误。现在我发现它是工作区中的信息,旧的项目并不是新CDT密码的最新版本。

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