C ++:实例化没有名称空间的对象

时间:2018-12-11 08:39:09

标签: c++ class namespaces

我陷在两个.hpp文件中,这些文件有很多共享相同名称的类/方法,依此类推。我的问题是A.hpp包裹在namespace里面,所以我可以使用我想使用的任何东西> A::className objName(...);

但是我不知道如何使用B.hpp中的任何东西,因为它没有包装在名称空间中,所以我无法编写B::className objName(...)

要求访问以更改任何.hpp文件的过程(我只是将B包装在名称空间中)需要大约一天的时间,所以我正在寻找替代的和更快的解决方案。

谢谢。

1 个答案:

答案 0 :(得分:2)

首先(可能也是最安全的方法),您可以在名称范围中添加一元作用域运算符::作为前缀,从而明确限定在全局范围内进行查找的条件:

::classFromB foo(/*...*/);
::globalFuncFromB( foo, &::globalVarFromB ); // Obviously this gets rather tedious.

第二,假设没有using指令(using namespace A;)或声明(using conflictsWithB = A::className)或其他声明不会产生冲突,则通常可以依靠不合格的查找:

classFromB foo(/*...*/);
globalFuncFromB( foo, &globalVarFromB  );

最后,您可以将包含文件的全部内容包装在名称空间中:

namespace B {
#include "B.hpp"
}

这有很多潜在的问题,特别是如果假定B.hpp中的任何声明是在标头本身或全局范围内的其他地方(实现B.cpp?)定义的或实际上定义的。不是最好的主意,但有时有用。 如果您考虑使用这种方法,请务必谨慎。