C ++中的嵌套NameSpaces

时间:2010-07-07 21:47:04

标签: c++ namespaces

我很困惑在拥有嵌套的命名空间和对象声明时该怎么做。

我正在移植一些链接到具有几个名称空间的静态库的代码。

我在谈论的例子:

namespace ABC {

    namespace XYZ {

        //STUFF
    }
}

在代码中,如何声明名称空间XYZ中的对象?

如果我尝试:

XYZ::ClassA myobject;

或:

ABC::XYZ::ClassA myobject;

或:

ABC::ClassA myobject;

我得到了

  

未命名类型

错误,即使ClassA肯定存在。

这里适当的是什么?

2 个答案:

答案 0 :(得分:47)

这取决于您已经拥有的命名空间:

如果您没有名称空间或其他不相关的名称空间,则必须指定整个路径ABC::XYZ::ClassA

如果您在ABC,则可以跳过ABC,然后只写XYZ::ClassA

另外,值得一提的是,如果要引用不在命名空间(或“根”命名空间)中的函数,可以用::作为前缀:

示例:

int foo() { return 1; }

namespace ABC
{
  double foo() { return 2.0; }

  void bar()
  {
    foo(); //calls the double version
    ::foo(); //calls the int version
  }
}

答案 1 :(得分:5)

如果在该命名空间中声明myobject并且您想再次声明它(用于定义它),则可以通过为其名称添加前缀而不是其类型来实现。

ClassA ABC::XYZ::myobject;

如果其类型也在该命名空间中声明,则还需要在类型名称前加上

ABC::XYZ::ClassA ABC::XYZ::myobject;

很少需要重新声明像这样的对象。通常,对象的第一个声明也是它的定义。如果要首先声明对象,则必须在该命名空间中执行此操作。以下声明并定义“myobject”

namespace ABC {
  namespace XYZ {
    ClassA myobject;
  }
}

如果您已在此类对象中定义,请通过说ABC::XYZ来引用它。您不必以某种方式“声明”该对象以便在本地使用它

void f() {
  ABC::XYZ::myobject = someValue;

  // you *can* however use a using-declaration
  using ABC::XYZ::myobject;
  myobject = someValue;
}