运算符<<超载

时间:2010-04-23 02:10:15

标签: c++ namespaces using std operator-keyword

//using namespace std;

using std::ifstream;

using std::ofstream;

using std::cout;

class Dog
{

    friend ostream& operator<< (ostream&, const Dog&);

    public:
        char* name;
        char* breed;
        char* gender;

        Dog();
        ~Dog();

};

我试图重载&lt;&lt;运营商。我也在努力练习良好的编码。但是我的代码不会编译,除非我取消注释using namespace std。我一直得到这个错误,我不知道。即时通讯使用g ++编译器。

Dog.h:20: error: ISO C++ forbids declaration of ‘ostream’ with no type
Dog.h:20: error: ‘ostream’ is neither function nor member function; cannot be declared friend. if i add line using std::cout; then i get this error.
Dog.h:21: error: ISO C++ forbids declaration of ‘ostream’ with no type. 

有人可以告诉我重载&lt;&lt;的正确方法吗?运算符没有使用命名空间std;

2 个答案:

答案 0 :(得分:3)

您有using std::ofstream而不是using std::ostream,因此它不知道ostream是什么。

您还需要加入<ostream>

但是,真的,没有理由使用using anything;你应该只使用命名空间限定名称(尤其是,如果这是一个头文件,以避免污染其他文件的全局命名空间):

friend std::ostream& operator<< (std::ostream&, const Dog&);

答案 1 :(得分:0)

using关键字只是意味着让您访问某些内容,而不会在其前缀中添加其命名空间。换句话说,using std::ofstream;只是说让std::ofstream作为ofstream访问。

您似乎还需要#include <iostream>;这就是编译器不知道ostream是什么的原因。把它放进去,将朋友声明更改为friend std::ostream& operator<< (std::ostream&, const Dog&);,并删除所有using内容,因为将using放入标题是不好的形式,你应该没问题。< / p>