Estoy utilizando una biblioteca que define operadores de flujo de salida (operador < <) en el espacio de nombres global. En mi propio espacio de nombres, siempre estaba declarando esos operadores en el espacio de nombres global, y nunca tuve problemas con ellos. Pero ahora, por varias razones, necesito declarar esos operadores en mi propio espacio de nombres, y de repente, parece que el compilador ya no puede encontrar los operadores declarados en la biblioteca.Espacios de nombres y resolución de operador
Aquí está un ejemplo simple que ilustra mi problema:
#include <iostream>
namespace A
{
struct MyClass {};
}
std::ostream & operator<<(std::ostream & os, const A::MyClass &)
{ os << "namespace A"; return os; }
namespace B
{
struct MyClass {};
std::ostream & operator<<(std::ostream & os, const B::MyClass &)
{ os << "namespace B"; return os; }
}
namespace B
{
void Test()
{
std::cout << A::MyClass() << std::endl;
std::cout << B::MyClass() << std::endl;
}
}
int main()
{
B::Test();
return 1;
}
estoy consiguiendo el error siguiente:
error: no match for ‘operator<<’ in ‘std::cout << A::MyClass()’
Tenga en cuenta que si ambos operadores están dentro de los espacios de nombres, o, alternativamente, si ambos están en el espacio de nombres global, el código se compila y ejecuta correctamente.
Realmente me gustaría entender qué está pasando y también cuál es la "buena práctica" para definir esos operadores con espacios de nombres.
Gracias!
+1 ¡Muy extraño! Si pongo 'Test' en' namespace A', ¡se compila y ejecuta correctamente! –