c++ - C++ 命名空间和运算符解析

  显示原文与译文双语对照的内容

我正在使用一个库,该库定义全局命名空间中的输出流运算符( 运算符 <<) 。 在我自己的命名空间中,我总是在全局命名空间中声明这些操作符,并且从不存在问题。 但是现在我需要在自己的命名空间中声明这些操作符,然后突然找到了在库中声明的运算符。

下面是一个演示我的问题的简单示例:


#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()'



注意,如果两个运算符都位于命名空间中,或者它们都在全局命名空间中,代码将正确编译和执行。

我真的想了解一下发生了什么,以及用于定义命名空间的这类运算符的"好练习"。

谢谢!

时间: 原作者:

我的答案非常类似,但特别是编译器试图找到 A::operator <<( ),因为它在命名空间中运行。 如果要调用命名空间外的一个,可以使用


::operator<<(std::cout, A::MyClass();



为了使用更流畅的语法,把它放在名称空间中。

原作者:
...