Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:父命名空间对子命名空间的可见性_C++ - Fatal编程技术网

C++ C++;:父命名空间对子命名空间的可见性

C++ C++;:父命名空间对子命名空间的可见性,c++,C++,如果您将ns2作为ns1的子命名空间,并且在ns2类的头中使用ns1类,那么是否需要像在ns1和ns2不相关时那样显式标记它 e、 g 按钮.h 对话.h 是这样吗?似乎我必须将dialog.h更改为: namespace ns1 { ----->class Button; namespace ns2 { 但我不太清楚为什么。名称空间不继承吗?如果不进行此更改,则会出现链接器错误,内容为“未解析的符号ns1::ns2:按钮::…”命名空间中声明的所有函数、类(类型)、变量等将在所有

如果您将ns2作为ns1的子命名空间,并且在ns2类的头中使用ns1类,那么是否需要像在ns1和ns2不相关时那样显式标记它

e、 g

按钮.h 对话.h 是这样吗?似乎我必须将dialog.h更改为:

namespace ns1
{
 ----->class Button;
 namespace ns2
 {
但我不太清楚为什么。名称空间不继承吗?如果不进行此更改,则会出现链接器错误,内容为“未解析的符号ns1::ns2:按钮::…”

命名空间中声明的所有函数、类(类型)、变量等将在所有子命名空间中可用(无前缀),以此类推。
因此,当名称空间n2在n1中定义时,n2中的所有代码都可以使用不带前缀的n1代码。

在gcc 4.4.5中,您的代码对我来说运行良好,无需额外声明按钮。您在
include
行中缺少一个
#
,但我想这只是一个转录错误。您确定这是导致问题的代码部分吗


编辑:在您的实际代码中,您可能没有使用名称ns1和ns2-可能您在某个地方拼错了名称空间?

您缺少一个#符号,请使用#include重新编译,您应该会没事的。问题是,如果不包含,则从未在另一个文件中实际声明过该类。

为什么不测试它?那么你不必在这里问它。因为我想知道它是如何工作的,而不仅仅是在它最终编译之前破解代码,也不知道为什么。我不想回答你的问题,但在使用嵌套名称空间之前,我真的会三思而后行——我怀疑你的代码是否复杂到足以保证它们的存在。C++名字空间是一个解决名字冲突的方法——如果你的名字不冲突,你不需要。也许我是猜疑的,我被java包感染了。那么为什么我会得到关于未解决的链接错误?“符号NS1::NS2::”按钮,如果我不添加那个额外的行?NS1::N2::按钮不存在,NS1::按钮。我说在ns2里面你可以使用n1代码。但是在外部,你必须给出正确的前缀。我有类似示例的代码,它无法链接,除非我进行所示的更改,即在ns2内部使用ns1类。
include "button.h"
namespace ns1
{
 namespace ns2
 {
  class TestDialog
  {
   Button *pButton;
  };
 }
}
namespace ns1
{
 ----->class Button;
 namespace ns2
 {