¿Por qué no puedo sobrecargar el operador << del operador de Ostream?
-
28-10-2019 - |
Pregunta
Editar: expresión pasada Exp y String Expression por referencia constante
Estoy tratando de permitir que una clase se muestre a través de Cout de la siguiente manera:
#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; }
};
Sin embargo, al compilar obtengo los errores:
main.cpp(9) : error C2061: syntax error : identifier 'ostream'
main.cpp(9) : error C2809: 'operator <<' has no formal parameters
Esto es especialmente confuso porque VC ++ me está dando ostream
Como sugerencia de autocompleto cuando entro std::
. ¿Qué está causando estos errores y cómo se pueden resolver?
Solución
Seguramente necesitas std::ostream
en todos los lugares? es decir:
friend std::ostream& operator <<(std::ostream& os, Expression& exp) ...
^^^
Otros consejos
Sin un using namespace std;
cláusula (que tiene su propio conjunto de problemas), debe calificar completamente todos la iostream
cosas.
Puede ver esto con el siguiente programa:
#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;
}
que imprime:
Hi, I'm Pax.
como se esperaba.
Y, como han señalado algunos comentarios, debe pasar la cadena como const-referencia:
#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;
}