首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套NameSpaces在C++中的应用

嵌套NameSpaces在C++中的应用
EN

Stack Overflow用户
提问于 2010-07-07 21:47:04
回答 2查看 36K关注 0票数 31

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

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

我所说的例子:

代码语言:javascript
复制
namespace ABC {

    namespace XYZ {

        //STUFF
    }
}

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

如果我试着:

代码语言:javascript
复制
XYZ::ClassA myobject;

或者:

代码语言:javascript
复制
ABC::XYZ::ClassA myobject;

或者:

代码语言:javascript
复制
ABC::ClassA myobject;

我得到了

不命名类型

错误,即使ClassA确实存在。

这里合适的是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-07 21:49:10

这取决于您已经存在的名称空间:

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

如果您在ABC中,可以跳过ABC,只需编写XYZ::ClassA

此外,值得一提的是,如果您想引用不位于命名空间(或"root“命名空间)中的函数,则可以使用::作为前缀。

示例:

代码语言:javascript
复制
int foo() { return 1; }

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

  void bar()
  {
    foo(); //calls the double version
    ::foo(); //calls the int version
  }
}
票数 47
EN

Stack Overflow用户

发布于 2010-07-08 06:34:14

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

代码语言:javascript
复制
ClassA ABC::XYZ::myobject;

如果它的类型也是在该命名空间中声明的,则还需要在该类型的名称前加上前缀。

代码语言:javascript
复制
ABC::XYZ::ClassA ABC::XYZ::myobject;

很少需要重新声明这样的对象。通常,对象的第一个声明也是它的定义。如果您想首先声明对象,则必须在该命名空间中进行声明。下面声明和定义"myobject“

代码语言:javascript
复制
namespace ABC {
  namespace XYZ {
    ClassA myobject;
  }
}

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

代码语言:javascript
复制
void f() {
  ABC::XYZ::myobject = someValue;

  // you *can* however use a using-declaration
  using ABC::XYZ::myobject;
  myobject = someValue;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3199139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档