【问题标题】:identifier "ostream" is undefined error [closed]标识符“ostream”是未定义的错误[关闭]
【发布时间】:2013-05-08 15:22:33
【问题描述】:

我需要实现一个支持运算符

这里是头文件:

数字.h

#ifndef NUMBER_H
#define NUMBER_H
#include <iostream>
class Number{
public:
//an output method (for all type inheritance from number):
virtual void show()=0;

//an output operator:
friend ostream& operator << (ostream &os, const Number &f);


};

#endif

为什么编译器无法识别友元函数中的ostream?

【问题讨论】:

  • 因为与所有标准库类型和函数一样,只有 没有 ostream。只有std::ostream

标签: c++ compiler-errors operators ostream


【解决方案1】:

Andy Prowl 的回答很棒,但请不要将“使用 std::ostream”放在标题中。如果你这样做,那么使用你的头文件的其他编译单元也将默认使用这个命名空间,你可能会因为命名空间冲突而遇到令人讨厌的编译错误。

【讨论】:

  • using std::ostream 将一个名称放入使用它的命名空间:ostream。这远没有using namespace std; 那样大的问题,它将std 中的每个 名称放入该命名空间。
  • 其他编译单元只会得到ostream这个名字,而不是命名空间。不过,我同意这是一个坏主意。
【解决方案2】:

您需要使用该类所在的命名空间的名称来完全限定名称 ostream

    std::ostream
//  ^^^^^

所以你的运营商声明应该变成:

friend std::ostream& operator << (std::ostream &os, const Number &f);
//     ^^^^^                      ^^^^^

或者,您可以在不限定名称 ostream 出现之前有一个 using 声明:

using std::ostream;

这将允许您在没有完全限定的情况下编写 ostream 名称,就像在您当前版本的程序中一样。

【讨论】:

  • 非常感谢!可以使用命名空间标准;也可以吗?
  • 尽管您不应该将using 放在标头的全局命名空间中,因为这可能会导致标头的其他用户发生名称冲突。
  • @AviadChmelnik:它会起作用,但正如 Mike Seymour 指出的那样,它被认为是一种糟糕的编程实践,因为很可能会引入名称冲突(尤其是在全局命名空间范围内放入标头时) )。如果可以,请选择
猜你喜欢
  • 2014-06-05
  • 2015-05-12
  • 2012-02-26
  • 2011-10-23
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多