重载ostream运算符c ++中的错误

时间:2014-03-18 18:45:39

标签: c++ operator-overloading

我正在重载我的类的ostream / istream操作符函数友好函数,但是它给出了错误: ostream没有命名类型。 没有或有头文件#include<iostream>它会出错

date.h:24:9: error: ‘ostream’ does not name a type friend ostream& operator<< (ostream &out, Date &today);

3 个答案:

答案 0 :(得分:1)

名称ostream位于std - 命名空间中,因此您需要引入该名称。最不具侵入性的方法是明确限定它:

friend std::ostream& operator<< ....
       ^^^

另一种方法是使用using - 或using namespace - 指令。它们允许您将名称/ s导入翻译单元的其余部分:

using std::ostream; // cherry-pick the names
friend ostream& operator<< ....

using namespace std; // fire a shotgun with a huge and growing bunch of names
friend ostream& operator<< ....

这些都有优点和缺点:

  • 名称变短,在上下文中可能更易阅读
  • 当其他名称空间定义相同的名称时,可能会出现名称冲突(例如std::powawesome_math_lib::pow)。

对于良好的C ++,一致同意的经验法则 - 代码是永远不要在头文件中的全局命名空间中使用usingusing namespace,并且在源文件中小心。

许多人也同意std::是如此简短和标准,他们从不使用usingusing namespace(函数除外),只是坚持键入std::...

答案 1 :(得分:0)

您必须使用

指定名称空间std
std::ostream

代码。

另一种方法是

using namespace std;

但不是首选。

答案 2 :(得分:-1)

您需要包含标题<iostream>并使用限定名称

std::ostream

或包含指令

using std::ostream;

甚至

using namespace std;

输出流的标准类ostream在名称空间std中声明。