Я использую библиотеку, которая определяет операторы выходного потока (operator < <) в глобальном пространстве имен. В моем собственном пространстве имен я всегда декларировал такие операторы в глобальном пространстве имен и никогда не испытывал проблем с ними. Но теперь по разным причинам мне нужно объявить эти операторы в моем собственном пространстве имен, и вдруг компилятор больше не может найти операторов, объявленных в библиотеке.
Вот простой пример, иллюстрирующий мою проблему:
#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;
}
Я получаю следующую ошибку:
error: no match for ‘operator<<’ in ‘std::cout << A::MyClass()’
Обратите внимание, что если оба оператора находятся в пространствах имен или, если они оба находятся в глобальном пространстве имен, код компилируется и выполняется правильно.
Мне бы очень хотелось понять, что происходит, а также то, что "хорошая практика" для определения таких операторов с пространствами имен.
Спасибо!