using指示符

Primer第三版中对于using指示符有以下阐述:

“using 指示符使名字空间成员名可见,就好像它们是在名字空间被定义的地方之外被声明的一样。using 指示符并没有为名字空间成员的名字声明局部的别名,而是把名字空间的成员转移到包含该名字空间定义的那个域中。”

这句话写得有些晦涩。先看一个例子:

namespace  A
{
    
int  i  =  20 ;
    
namespace  B
    {
        
int  i  =   10 ;
    }
}

int  main()
{
    
using   namespace  A::B;
    i= 30
;
}

按照上述说法,在using namespace A::B后,B中的i 就好像是在A中声明的一样,因此与A中的i重复定义,编译器应该报错,但事实上,上述代码没有问题,这是怎么回事呢?

A不是定义在main()函数的局部域中,在main的局部域中using namespace A::B,A的定义不可见,所以再向外一层,到了全局域,而全局域包含A的定义,因此最终,B中的i 就好像是在全局域中声明的一样。

下面的代码验证上面的推测:

#include  < iostream >
using   namespace  std;

namespace  A
{
    
int  i  =   20 ;
    
namespace  B
    {
        
int  i  =   10 ;
    }
    
    
void  foo()
    {
        
using   namespace  A::B;
        cout
<< i << endl;
    }
}

int  main()
{
    A::foo();
}

此时,using namespace A::B 时,是在A内,A的定义可见,因此,B中的i 就好像是在A中声明的一样。此时,不出所料,编译器报错,i的使用歧义。

test.cpp:15: error: use of `i' is ambiguous

test.cpp:6: error:   first declared as `int A::i' here

test.cpp:9: error:   also declared as `int A::B::i' here

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值