我写了一个运算符<<对于我的模板类:
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)
答案 0 :(得分:13)
我也遇到了这个错误。
//print the value
cout << rt->element << endl;
一个简单的改动:
//print the value
cout << rt->element;
cout << endl;
为我删除了错误。 C ++的新手,但似乎你还需要重载&lt;&lt;对于myClassInstance。如果你想使用原始方法。
答案 1 :(得分:12)
答案 2 :(得分:11)
问题是(据我所知)使用Eclipse的代码分析工具。
如果您愿意,可以通过完全禁用对无效重载的检查来避免此消息:
然后你会看到错误消失了。
然而,它可能会跳过真正的错误,最好让它保持检查状态,但使用“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个错误:
我尝试了很多东西,重建索引,搞乱代码分析工具(以与构建方式相同的方式配置它),然后编写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 found
,invalid overload of endl
,Invalid arguments ...
的所有奇怪错误。现在我发现它是工作区中的信息,旧的项目并不是新CDT密码的最新版本。
对于某人在升级eclipse或将工作区复制到新平台后遇到同样的问题。实际上很容易解决:Project->C/C++ index->Rebuild
。完成后,所有奇怪的错误都会消失。