【问题标题】:C++: Visibility of parent namespace to child namespaceC++:父命名空间对子命名空间的可见性
【发布时间】:2010-01-17 21:04:24
【问题描述】:

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

例如

button.h

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

对话框.h

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

应该是这样吧?看来我必须将 dialog.h 更改为:

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

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

【问题讨论】:

  • 你为什么不测试一下?那你就不用在这里问了。
  • 因为我想知道它是如何工作的,而不仅仅是破解代码直到它最终编译并且不知道为什么。
  • 不回答您的问题,但在使用嵌套命名空间之前我真的会三思而后行 - 我怀疑您的代码是否足够复杂以保证它们的有效性。 C++ 命名空间是名称冲突的解决方案 - 如果您的名称不冲突,则不需要它们。
  • 也许你是对的,我怀疑是被 Java 包感染了。

标签: c++


【解决方案1】:

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

【讨论】:

  • 那么如果我不添加额外的行,为什么我会收到关于未解决的“symbol ns1::ns2::Button”的链接器错误?
  • ns1::n2::Button 不存在,ns1::Button 存在。我说在ns2里面你可以使用n1代码。但是在外面你必须给出正确的前缀。
  • 好吧,我有与给出的示例类似的代码,它无法链接,除非我做出所示的更改,即使用 ns2 中的 ns1 类。
【解决方案2】:

您的代码在 gcc 4.4.5 中对我来说可以正常工作,而无需额外声明 Button。您在include 行中缺少#,但我想这只是一个转录错误。您确定这是导致问题的代码部分吗?

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

【讨论】:

    【解决方案3】:

    您缺少# 符号,使用#include 重新编译,您应该没问题。问题是当您不包含时,您实际上从未在其他文件中声明该类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2010-12-23
      • 2018-10-25
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多