我正在使用一個在全局名稱空間中定義輸出流運算符(運算符< <)的庫。在我自己的命名空間中,我總是在全局命名空間中聲明這樣的運算符,並且從來沒有遇到過問題。但現在由於各種原因,我需要在自己的命名空間中聲明這些運算符,並且突然間,編譯器似乎無法再找到在庫中聲明的運算符。命名空間和運算符分辨率
這裏有一個簡單的例子,說明我的問題:
#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()’
需要注意的是,如果這兩個運營商的命名空間內,或者,如果他們都在全局名稱空間中,代碼編譯並正確執行。
我真的很想知道發生了什麼,以及用命名空間定義這些運算符的「良好實踐」。
謝謝!
+1很奇怪!如果我把'Test'放在'namespace A'中,它會編譯並正確執行! – 2011-03-04 15:26:37