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

时间:2010-01-17 21:04:25

标签: c++

如果你有ns2作为ns1的子命名空间,并且你在ns2类的头文件中使用ns1类,你是否需要像在ns1&时那样明确地去掉它。 ns2是无关的?

e.g

button.h

namespace ns1
{
 class Button
 {
  ...
 };
}

dialog.h

include "button.h"
namespace ns1
{
 namespace ns2
 {
  class TestDialog
  {
   Button *pButton;
  };
 }
}

这应该是对的吗?我似乎必须将dialog.h更改为:

namespace ns1
{
 ----->class Button;
 namespace ns2
 {

但我不太清楚为什么。命名空间不能继承吗?如果我没有进行此更改,我会收到有关“未解析的符号ns1 :: ns2:Button :: ...”的链接器错误。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您的代码在gcc 4.4.5中可以正常使用,无需另外的Button声明。您错过了#行中的include,但我认为这只是一个转录错误。您确定这是导致问题的代码的一部分吗?

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

答案 2 :(得分:-1)

你错过了#符号,用#include重新编译,你应该没问题。问题是当你不包含时,你从未在另一个文件中实际声明该类。