C++中的嵌套NameSpaces

jDO*_*DOG 31 c++ namespaces

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

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

我在说什么的例子:

namespace ABC {

    namespace XYZ {

        //STUFF
    }
}
Run Code Online (Sandbox Code Playgroud)

在代码中我该怎么做来声明命名空间中的对象XYZ

如果我尝试:

XYZ::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)

要么:

ABC::XYZ::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)

要么:

ABC::ClassA myobject;
Run Code Online (Sandbox Code Playgroud)

我明白了

没有命名类型

错误,即使ClassA确实存在.

什么是合适的?

ere*_*eOn 48

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

如果您没有名称空间或其他不相关的名称空间,则必须指定整个路径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
  }
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 5

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

ClassA ABC::XYZ::myobject;
Run Code Online (Sandbox Code Playgroud)

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

ABC::XYZ::ClassA ABC::XYZ::myobject;
Run Code Online (Sandbox Code Playgroud)

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

namespace ABC {
  namespace XYZ {
    ClassA myobject;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你已经在这样的对象中定义了,你可以通过这样的方式来引用它ABC::XYZ.您不必以某种方式"声明"该对象以便在本地使用它

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

  // you *can* however use a using-declaration
  using ABC::XYZ::myobject;
  myobject = someValue;
}
Run Code Online (Sandbox Code Playgroud)