2011-06-30 53 views
2

我正在重新安排相对较大的C++项目中的代码的名称空间。我一直遇到的一个难题是,有时全球运营商的超载会变得无法访问。诸如流操作符(< <和>>)和等号运算符(==)之类的东西,有时候导致这种情况的唯一更改是从“namespaceA”移动到“parent :: namespaceA”。名字空间“parent”已经存在。全局运算符在哪些情况下隐藏在C++中?

我可以明确地将解决这些问题:

using ::operator<<; 
using ::operator>>; 
using ::operator==; 
在受影响的文件

(从“namespaceA”),虽然我有点惊讶地看到这项工作。

但是,这感觉就像我只是在某个地方掩盖更深层次的问题。

所以我的问题是这样的:你会期望掩盖/隐藏全球运营商发生什么情况?

注意:我怀疑它可能是嵌套命名空间阻止Koenig Lookup做它的事情,但是做一些测试用例表明这不是问题。另一个潜在的重点是受影响的全球运营商似乎都是模板化的功能。然而,我有兴趣更好地理解全局名称空间运算符如何消失......所有答案都表示赞赏。

显然这是与父命名空间有关,但我不完全确定我在找什么。我可以理解一个操作符被再次重载,以致错误的版本被调用,但是我得到的编译错误甚至找不到具有正确签名的操作符!

回答

1

您可能会忘记名称查找如何工作。当您使用operator<<时,它几乎总是为a << b,而不是::parent::namespaceA::operator<<(a,b)。这种不合格的使用意味着它通过参数依赖查找(又名Koenig查找)查找。

因此,来自全局名称空间的运算符将被运算符从参数的名称空间隐藏。

+0

如果这是真的,那么不应该使用参数名称空间中的操作符...而不是我得到的错误,其中编译器无法找到具有正确签名的任何操作符? – ferrouswheel

+0

实际上,我提出的上述评论是误导性的,因为参数名称空间中没有操作符。在这种情况下,编译器是否应该恢复到全球运营商? – ferrouswheel

+0

@ferrouswheel:不是马上。在选中':: A :: B'后,选中':: A',然后选择'::'。 – MSalters

1

如果在命名空间中有操作符,它们将被找到,并且查找在那里停止。

无论是“正确的”重载还是无关紧要。

+0

...这是我的问题,找不到合适的操作员。我得到了“错误:在...中不匹配'operator <<',然后是候选者列表,全部来自std名称空间。 – ferrouswheel

相关问题