Tengo operadores declarados para la clase my_type
en el espacio de nombres my_namespace
.gcc failes para compilar la definición del operador con el espacio de nombres prefijado
namespace my_namespace {
class my_type
{
friend std::ostream& operator << (std::ostream& out, my_type t);
}
}
Estoy tratando de definir estos operadores en el archivo de implementación, pero cuando escribo algo así
std::ostream& my_namespace::operator << (std::ostream& out, my_type t)
{
out << t;
return out;
}
Puedo obtener mensaje de error
error: ... operator should have been declared inside 'my_namespace'
Cuando lo cambio a
namespace my_namespace {
std::ostream& operator << (std::ostream& out, my_type t)
{
out << t;
return out;
}
}
luego compila, pero no entiendo el problema. ¿Por qué no se pudo compilar? ¿Hay todo lo correcto con eso? Agradecería el enlace al estándar ya que realmente no sé qué buscar.
añade
file.h
#ifndef A_H
#define A_H
#include <iosfwd>
namespace N
{
class A
{
friend std::ostream& operator << (std::ostream& out, A& obj);
};
}
#endif
file.cpp
#include "file.h"
#include <iostream>
std::ostream& N::operator << (std::ostream& out, N::A& obj)
{
return out;
}
int main() {}
aquí es ejemplo completo. Esto funciona bien en VS2010, pero proporciona el error mencionado anteriormente en gcc 4.4.5.
añade
hmm ... sí, éste funciona
namespace N
{
class A
{
friend std::ostream& operator << (std::ostream& out, A& obj);
};
std::ostream& operator << (std::ostream& out, A& obj);
}
Siempre estaba pensando que en términos de visibilidad del operador se declara amigo en clase es lo mismo que declarar fuera de la clase .. parece que no lo es. Gracias.
Muchas gracias de antemano.
En GCC, compilar esto con la opción '-ffriend-injection' tendrá éxito. – user7610