我正在重新安排相对较大的C++项目中的代码的名称空间。我一直遇到的一个难题是,有时全球运营商的超载会变得无法访问。诸如流操作符(< <和>>)和等号运算符(==)之类的东西,有时候导致这种情况的唯一更改是从“namespaceA”移动到“parent :: namespaceA”。名字空间“parent”已经存在。全局运算符在哪些情况下隐藏在C++中?
我可以明确地将解决这些问题:
using ::operator<<;
using ::operator>>;
using ::operator==;
在受影响的文件
(从“namespaceA”),虽然我有点惊讶地看到这项工作。
但是,这感觉就像我只是在某个地方掩盖更深层次的问题。
所以我的问题是这样的:你会期望掩盖/隐藏全球运营商发生什么情况?
注意:我怀疑它可能是嵌套命名空间阻止Koenig Lookup做它的事情,但是做一些测试用例表明这不是问题。另一个潜在的重点是受影响的全球运营商似乎都是模板化的功能。然而,我有兴趣更好地理解全局名称空间运算符如何消失......所有答案都表示赞赏。
显然这是与父命名空间有关,但我不完全确定我在找什么。我可以理解一个操作符被再次重载,以致错误的版本被调用,但是我得到的编译错误甚至找不到具有正确签名的操作符!
如果这是真的,那么不应该使用参数名称空间中的操作符...而不是我得到的错误,其中编译器无法找到具有正确签名的任何操作符? – ferrouswheel
实际上,我提出的上述评论是误导性的,因为参数名称空间中没有操作符。在这种情况下,编译器是否应该恢复到全球运营商? – ferrouswheel
@ferrouswheel:不是马上。在选中':: A :: B'后,选中':: A',然后选择'::'。 – MSalters