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

您需要指定命名空间。前缀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

ostream 是 std:: 命名空间的成员,所以要么using namespace 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 回答