web-dev-qa-db-ja.com

Eclipseは不平を言います:「 'endl'の無効なオーバーロード」-しかしコードはコンパイルします

テンプレートクラスの演算子<<を作成しました:

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を使用しています)

22
einpoklum

これは確かにEclipse CDT(より具体的にはEclipseのコード分析ツールCODAN)のバグです。 バグ レポートがあり、それは 修正済み であり、2014年2月に予定されているCDT 8.3.0から入手できるはずです。

12
iNFINITEi

このエラーも発生していました。

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

簡単な変更:

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

私のエラーを削除しました。 C++の新機能ですが、myClassInstanceに対して<<もオーバーロードする必要があるようです。オリジナルの方法を使用したい場合。

13
frmdstryr

問題は(私が理解しているように)Eclipseのコード分析ツールにあります。

必要に応じて、無効なオーバーロードのチェックを完全に無効にすることで、このメッセージを回避できます。

  1. 設定ウィンドウを開く(メインメニューウィンドウ\設定から)
  2. C/C++->コード分析に移動します
  3. 右側のペインで、「構文およびセマンティックエラー」を参照してください。 「無効なオーバーロード」
  4. チェックボックスをオフにします
  5. OKを押します

その後、エラーが消えたことがわかります。

ただし、実際のエラーはスキップされる可能性があるため、チェックされたままにして、[選択項目をカスタマイズ]ボタンを使用して重大度を変更する方がよい場合があります。

「エラー」ではなく「警告」に変更しました。

@plasmaHHが言ったように、このシナリオではEclipseがC++を正しく解析できなかったと思います。

11
phoad

これは古い質問であることはわかっていますが、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...と書きました。

私の場合、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;
1
Dargazo

次の行のように、コメント// @suppress("Invalid overload")を追加してみてください。

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

これはその問題を抑制し、コードのどこかに他の考えられる無効なオーバーロードを検出する機能を維持します。

ところで、エディタの左側にあるバグをクリックすると、Eclipseがそれを行います。 (Eclipse:Oxygen)。

1
dsenic2000

古い質問ですが、将来の訪問者にとって、私にとってエラーが消えたのは、完全に修飾されたcoutとendlを使用することでした。

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

Eclipseがコード内の特定の場所で名前空間なしでコンパイルして正常に実行されるため、Eclipseがそこに文句を言う理由がわかりません。

0
uiron

これは、Eclipseをアップグレードするときにも起こります。 Member declaration not foundinvalid overload of endlInvalid arguments ...のすべての奇妙なエラーがあります。今、私はそれがワークスペース内の情報であり、古いプロジェクトが新しいCDTコーダンにとって最新のものではないことを理解しました。

Eclipseをアップグレードした後、またはワークスペースを新しいプラットフォームにコピーした後に誰かが同じ問題を抱えています。実際に解決するのは非常に簡単です:Project->C/C++ index->Rebuild。それが完了すると、すべての奇妙なエラーがなくなります。

0
Wang

クラスのメンバーとしてendlまたはoverloadの代わりにstd :: endlを配置してみてください。

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