Почему я не могу перегрузить оператор << ostream? - PullRequest
0 голосов
/ 17 июня 2011

РЕДАКТИРОВАТЬ: Передано выражение Exp и строковое выражение по константной ссылке

Я пытаюсь разрешить отображение класса через cout следующим образом:

#include <iostream>

class Expression {
private:
    std::string expression;
public:
    Expression(const std::string& expression):
        expression(expression) { }
    friend std::ostream& operator <<(ostream& os, const Expression& exp) {
        return os << exp.expression; }
};

однако припри компиляции я получаю сообщения об ошибках:

main.cpp(9) : error C2061: syntax error : identifier 'ostream'
main.cpp(9) : error C2809: 'operator <<' has no formal parameters

, что особенно запутанно, потому что VC ++ дает мне ostream в качестве предложения автозаполнения при вводе std::.Что является причиной этих ошибок и как их можно устранить?

Ответы [ 2 ]

13 голосов
/ 17 июня 2011

Конечно, вам нужно std::ostream во всех местах? i.e.:

friend std::ostream& operator <<(std::ostream& os, Expression& exp) ...
                                 ^^^
2 голосов
/ 17 июня 2011

Без предложения using namespace std; (которое имеет собственный набор проблем) вам необходимо полностью квалифицировать все iostream материал.

Это можно увидеть с помощью следующегоПрограмма:

#include <iostream>

class Expression {
private:
    std::string expression;
public:
    Expression(std::string expression):
        expression(expression) { }
    //                                  added this bit.
    //                                _/_
    //                               /   \
    friend std::ostream& operator <<(std::ostream& os, Expression& exp) {
        return os << exp.expression; }
};

int main (void) {
    Expression e ("Hi, I'm Pax.");
    std::cout << e << std::endl;
    return 0;
}

, которая печатает:

Hi, I'm Pax.

, как и ожидалось.


И, как указывалось в некоторых комментариях, вы должны передать строкукак const-ссылка:

#include <iostream>

class Expression {
private:
    std::string expression;
public:
    Expression(const std::string& expression)
    : expression(expression) {
    }
    friend std::ostream& operator <<(std::ostream& os, const Expression& exp) {
        return os << exp.expression;
    }
};

int main (void) {
    Expression e ("Hi, I'm Pax.");
    std::cout << e << std::endl;
    return 0;
}
...