C++ 中的嵌套命名空间

2022-01-14 00:00:00 namespaces c++

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

I am confused what to do when having nested namespaces and declarations of objects.

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

I am porting some code that links against a static library that has a few namespaces.

我所说的例子:

namespace ABC {

    namespace XYZ {

        //STUFF
    }
}

如何在代码中声明一个位于命名空间 XYZ 中的对象?

In code what do I do to declare an object that is in namespace XYZ?

如果我尝试:

XYZ::ClassA myobject;

或:

ABC::XYZ::ClassA myobject;

或:

ABC::ClassA myobject;

我明白了

没有命名类型

错误,即使 ClassA 确实存在.

errors, even though ClassA definitely exists.

这里有什么合适的?

推荐答案

这取决于你已经在的命名空间:

It depends on the namespace you already are:

如果您不在命名空间或另一个不相关的命名空间中,则必须指定整个路径 ABC::XYZ::ClassA.

If you're in no namespace or another, unrelated namespace, then you have to specify to whole path ABC::XYZ::ClassA.

如果您在 ABC 中,则可以跳过 ABC 并直接编写 XYZ::ClassA.

If you're in ABC you can skip the ABC and just write XYZ::ClassA.

另外,值得一提的是,如果你想引用一个不在命名空间(或根"命名空间)中的函数,你可以在它前面加上 :::

Also, worth mentioning that if you want to refer to a function which is not in a namespace (or the "root" namespace), you can prefix it by :::

例子:

int foo() { return 1; }

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

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

相关文章