テンプレートクラスの演算子<<を作成しました:
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を使用しています)
このエラーも発生していました。
//print the value
cout << rt->element << endl;
簡単な変更:
//print the value
cout << rt->element;
cout << endl;
私のエラーを削除しました。 C++の新機能ですが、myClassInstanceに対して<<もオーバーロードする必要があるようです。オリジナルの方法を使用したい場合。
問題は(私が理解しているように)Eclipseのコード分析ツールにあります。
必要に応じて、無効なオーバーロードのチェックを完全に無効にすることで、このメッセージを回避できます。
その後、エラーが消えたことがわかります。
ただし、実際のエラーはスキップされる可能性があるため、チェックされたままにして、[選択項目をカスタマイズ]ボタンを使用して重大度を変更する方がよい場合があります。
「エラー」ではなく「警告」に変更しました。
@plasmaHHが言ったように、このシナリオではEclipseがC++を正しく解析できなかったと思います。
これは古い質問であることはわかっていますが、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
...と書きました。
私の場合、3つのエラーすべてを修正したのは、
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;
次の行のように、コメント// @suppress("Invalid overload")
を追加してみてください。
cout << "SOME TEXT" << endl; // @suppress("Invalid overload")
これはその問題を抑制し、コードのどこかに他の考えられる無効なオーバーロードを検出する機能を維持します。
ところで、エディタの左側にあるバグをクリックすると、Eclipseがそれを行います。 (Eclipse:Oxygen)。
古い質問ですが、将来の訪問者にとって、私にとってエラーが消えたのは、完全に修飾されたcoutとendlを使用することでした。
std::cout << thing << std::endl
Eclipseがコード内の特定の場所で名前空間なしでコンパイルして正常に実行されるため、Eclipseがそこに文句を言う理由がわかりません。
これは、Eclipseをアップグレードするときにも起こります。 Member declaration not found
、invalid overload of endl
、Invalid arguments ...
のすべての奇妙なエラーがあります。今、私はそれがワークスペース内の情報であり、古いプロジェクトが新しいCDTコーダンにとって最新のものではないことを理解しました。
Eclipseをアップグレードした後、またはワークスペースを新しいプラットフォームにコピーした後に誰かが同じ問題を抱えています。実際に解決するのは非常に簡単です:Project->C/C++ index->Rebuild
。それが完了すると、すべての奇妙なエラーがなくなります。
クラスのメンバーとしてendlまたはoverloadの代わりにstd :: endlを配置してみてください。
template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
std::cout << f;
return *this;
}