C++ C++;:实例化没有命名空间的对象
我一直在处理两个C++ C++;:实例化没有命名空间的对象,c++,class,namespaces,C++,Class,Namespaces,我一直在处理两个.hpp文件,它们有许多类/方法共享相同的名称等等。我的问题是A.hpp被包装在名称空间中,因此我可以使用A::className objName(…)使用我想要的任何东西 但是我不知道如何使用B.hpp中的任何内容,它没有包装在名称空间中,因此我无法编写B::className objName(…) 请求访问以更改任何.hpp文件(我将在名称空间中仅包装B)的过程大约需要一天,因此我正在寻找替代的、更快的解决方案 谢谢。首先,而且可能是最安全的,您可以通过在名称前面加上一元范围
.hpp
文件,它们有许多类/方法共享相同的名称等等。我的问题是A.hpp
被包装在名称空间中
,因此我可以使用A::className objName(…)使用我想要的任何东西代码>
但是我不知道如何使用B.hpp
中的任何内容,它没有包装在名称空间中,因此我无法编写B::className objName(…)
请求访问以更改任何.hpp
文件(我将在名称空间中仅包装B)的过程大约需要一天,因此我正在寻找替代的、更快的解决方案
谢谢。首先,而且可能是最安全的,您可以通过在名称前面加上一元范围运算符来明确限定全局范围中的查找:
::classFromB foo(/*...*/);
::globalFuncFromB( foo, &::globalVarFromB ); // Obviously this gets rather tedious.
其次,假设使用
指令(使用命名空间A;
)或声明(使用conflictsWithB=A::className
)或其他声明不会产生冲突,则通常可以依赖非限定查找:
classFromB foo(/*...*/);
globalFuncFromB( foo, &globalVarFromB );
最后,您可以将包含文件的全部内容包装到命名空间中:
namespace B {
#include "B.hpp"
}
这有许多潜在的问题,特别是如果假定或实际定义了B.hpp中的任何声明,无论是在报头本身还是全局范围内的其他地方(实现B.cpp?)。不是最好的主意,但有时很有用<如果您考虑此方法,请非常谨慎。
第一,并且可能是最安全的,您可以通过用一元范围操作符<代码>::/<代码>:
预先命名一个名称,在全局范围内显式限定查找。::classFromB foo(/*...*/);
::globalFuncFromB( foo, &::globalVarFromB ); // Obviously this gets rather tedious.
其次,假设使用指令(
使用命名空间A;
)或声明(使用conflictsWithB=A::className
)或其他声明不会产生冲突,则通常可以依赖非限定查找:
classFromB foo(/*...*/);
globalFuncFromB( foo, &globalVarFromB );
最后,您可以将包含文件的全部内容包装到命名空间中:
namespace B {
#include "B.hpp"
}
这有许多潜在的问题,特别是如果假定或实际定义了B.hpp中的任何声明,无论是在报头本身还是全局范围内的其他地方(实现B.cpp?)。不是最好的主意,但有时很有用<如果你考虑这个方法,就要非常小心。< /强> 如果它没有被包裹在一个命名空间B中,那么就跳过B::并且在做了一个包含“B.HPP”的尝试之后,直接使用这些名字,做不到。它仍然说“对
类的引用是不明确的”@Rorschach如果是这样的话,你能把B包装在一个名称空间中吗?如果这两个函数/成员共享命名函数/成员,最好为它们使用单独的名称空间anyway@Tom是的,正如我说的,我需要向系统管理员发送电子邮件,等待他们发送到chmod
这个文件,诸如此类,这就是为什么我在寻找替代方案。但是,是的,我确信这会起作用。可能在某个地方有“使用命名空间A”,请尝试将其删除。如果它没有包装在命名空间B中,则只需跳过B::并在执行A之后直接使用名称,包括我尝试过的“B.hpp”,但无法执行。它仍然说“对类的引用是不明确的”@Rorschach如果是这样的话,你能把B包装在一个名称空间中吗?如果这两个函数/成员共享命名函数/成员,最好为它们使用单独的名称空间anyway@Tom是的,正如我说的,我需要向系统管理员发送电子邮件,等待他们发送到chmod
这个文件,诸如此类,这就是为什么我在寻找替代方案。但是,是的,我确信这会起作用。可能有“使用命名空间A”的地方,请尝试删除它。谢谢,第一个选项很好,直到我有权更改文件并将所有内容包装到两个单独的名称空间中,它才会起作用。如果在B.hpp
中声明的任何函数或对象在单独的编译单元中定义,则在名称空间中包装头文件将不起作用。特别是,如果这些函数或定义这些对象的源代码不可用(例如,仅在已编译的对象或库中可用),则该选项将不起作用。@Peter这是我在该选项后面的注释的预期含义。从本质上讲,它可以工作,但通常不会工作——甚至产生工作部分和不工作部分的混合。@pandorafalters——如果标题定义了它声明的所有内容,那么可能更容易说它只工作。例如,如果B是一个只包含标题的库(命名空间B
不是std
或它的别名,因为在std
中声明名称在所有情况下都会产生未定义的行为,但在某些特定情况下除外)。@Peter I试图在一个简短的警告中解决最广泛的可能性,这可能是错误的。例如,如果任何“内部”查找都是显式限定的,则即使只有头的库在包含到命名空间中时也可能失败,直到我有权更改文件并将所有内容包装到两个单独的名称空间中,它才会起作用。如果在B.hpp
中声明的任何函数或对象在单独的编译单元中定义,则在名称空间中包装头文件将不起作用。特别是,如果这些函数或定义这些对象的源代码不可用(例如,仅在已编译的对象或库中可用),则该选项将不起作用。@Peter这是我在该选项后面的注释的预期含义。从本质上讲,它可以工作,但通常不会工作——甚至产生工作部分和不工作部分的混合。@pandorafalters——如果标题定义了它声明的所有内容,那么可能更容易说它只工作。例如,如果B是一个只包含标题的库(命名空间B
不是std
或它的别名,因为在std
中声明名称在所有情况下都会产生未定义的行为,但在某些特定情况下除外)。@Peter I试图在一个简短的警告中解决最广泛的可能性,这可能是错误的。例如,即使是只有头的库m