1
#include <iostream>
#include <fstream>

class obj
{
public:
 int i;
 friend ostream& operator<<(ostream& stream, obj o);
}

void main()
{
 obj o;
 ofstream fout("data.txt");
 fout<<o;
 fout.close();
}

これは私のコードです、エラーが発生しています。エラー:ostream:あいまいなシンボル。

誰でも私を助けることができます。

4

6 に答える 6

3

名前空間を指定する必要があります。プレフィックス-ie ostream_stdstd::ostream

また、演算子へのconst参照によってobjタイプを渡す必要があります。

friend ostream& operator<<(ostream& stream, const obj& o);
于 2010-09-01T13:24:07.033 に答える
2

名前空間stdを使用しなかったため(名前空間stdを使用するのはとにかく習慣です)、コンパイラはostreamが一体何であるかを知りません。それに加えて、実際にはoperator <<を定義せず、宣言しただけなので、それを認識した場合、あなたがそれを言わなかったので、それは何をすべきかわかりません。

于 2010-09-01T13:23:47.657 に答える
1

私が見るように、あなたはする必要があります

  • 追加

    using std::ostream;
    using std::ofstream;

  • ;クラス宣言の後にを追加します
  • <<演算子の実装を提案します。

最終的には、次のような結果になるはずです。

#include <iostream>
#include <fstream>

using std::ostream;
using std::ofstream;

class obj
{
public:
 int i;
 friend ostream& operator<<(ostream& stream, const obj& o);
};

ostream& operator<<(ostream& stream, const obj& o)
{
  std::cout << o.i;
  return stream;
}

int main()
{
  obj o;
  ofstream fout("data.txt");
  fout << o;
  fout.close();
}
于 2010-09-01T13:25:18.307 に答える
0

ofstreamは名前空間stdにあるため、次のように宣言する必要がありますfout

std::ofstream fout("data.txt");

簡単にするために、operator<<関数の定義を単に省略したと仮定します。明らかに、次の行をコンパイルするには、その関数の本体を記述する必要があります。

于 2010-09-01T13:24:01.467 に答える
0

using namespace std;ostreamはstd::名前空間のメンバーであるため、クラス宣言の前にaを付けるか、明示的に参照してくださいstd::ostream

于 2010-09-01T13:24:25.473 に答える
0

オブジェクトを参照として渡すことを検討してください。そうしないと、コピー コンストラクターを介して毎回新しい obj オブジェクトが作成されます。

friend ostream& operator<<(ostream& stream, obj& o);  
于 2010-09-01T13:32:29.523 に答える