23

テンプレート化されたクラスの operator<< を作成しました。

template<class T>
std::ostream& operator<<(std::ostream &strm, const MyClass<T> &obj)

そして私が書くとき

cout << myClassInstance << endl;

これはコンパイルして実行しますが、私のEclipse CDTは次のように述べています:

「endl」の無効なオーバーロード

なぜそれが私にそれを教えてくれるのですか?

(Win7 64bit で Cygwin gcc を使用して Eclipse CDT Kepler を使用しています)

4

8 に答える 8

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();

日食は3つのエラーを報告しました:

  • 「endl」の無効なオーバーロード
  • メソッド 'c_str' を解決できませんでした
  • メソッド「str」を解決できませんでした

私はたくさんのことを試し、インデックスを再構築し、コード分析ツールをいじり(私のビルドと同じように設定しました)、そして書きましたstd::endl...すべて役に立ちませんでした。

私の場合、3つのエラーすべてを修正したのは、交換することでした

stringstream l_Buffer;

と:

basic_stringstream<char> l_Buffer;

注: Ctrl + クリックするstringstreamと、次のような typedef 定義が表示されますiosfwd.h

/// Class for @c char mixed input and output memory streams.
typedef basic_stringstream<char>    stringstream;
于 2016-07-07T13:59:07.850 に答える
0

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

template<class T>
MyClass<T>& operator<<( std::ostream&(*f)(std::ostream&) ) {
  std::cout << f;
  return *this;
}
于 2014-10-30T10:41:14.607 に答える