C++ namespace不同区间的引用

我在考虑这么一个问题:

namespace A
{
  namespace A1
  {
    int a = 1;
  }

  namespace A2
  {
    void doIt()
    {
      cout << A1::a << endl;
    }
  }
}

A, A1, A2 都是命名空间。A::A2::doIt() 要引用 A::A1::a,该如何写。

 

我查《C++ Primer》没有找到答案。

 

通过测试,得出这么一个规则,以 doIt() 引用 A::A1::a 为例。可以如此引用:A1::a。

编译器首先在本作用域找有没有 A1::a,即 A::A2::doIt()

如果没有找到,则再找更外围一层去找,即 A::A2,发现也没办法匹配 A1::a。

它再到更外一层去找,即 A,A下面可以找到A1::a。

完成引用。

 

那么有另一个问题:如果存在 A::A2::A1::a 那怎么办?按我们刚刚的查找规则,是不是优先使用 A::A2::A1::a 呢?

试试看:

namespace A
{
  namespace A1
  {
    int a = 1;
  }

  namespace A2
  {
    namesapce A1
    {
      int a = 2;
    }

    void doIt()
    {
      cout << A1::a << endl;
    }
  }
}

实验证明,它优先使用了 A::A2::A1::a 。

 

另一个需要提及一下。如果是这样:

namespace A
{
  namespace A1
  {
    int a = 1;
  }

  namespace A2
  {
    namesapce A1
    {
      // int a = 2;
    }

    void doIt()
    {
      cout << A1::a << endl;
    }
  }
}

刻意屏蔽 A::A2::A1::a,那么就编译不过。

 

说明,编译器在为 A::A2::doIt() 找 A1::a 的时候,的逻辑是:

编译器首先在本作用域找有没有 A1 区域,即 A::A2::doIt() 函数内部。

如果没有找到,则再找更外围一层去找,即 A::A2,发现找到了 A1。

它就进入 A::A2::A1 中,进一步去找这个区域里是否有 a。如果没有,则报错。

编译器并没有再向上进行尝试。

转载于:https://my.oschina.net/hevakelcj/blog/2222758

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值