读书人

请各位帮忙解忙解答一个小弟我个人认为

发布时间: 2012-02-17 17:50:42 作者: rapoo

请各位帮忙解忙解答一个我个人认为正确,而书上却标示错误的问题!(namespace)
在《C++primer》上看到这样一个例子(P364--365)
namespace blip
{
int bi = 16, bj = 15, bk = 23;
}
int bj = 0;
void manip()
{
using namespace blip;
++bi;
++bj; --------------1
++::bj;
}
句1处我个人认为正确,因为我认为using 位于方法内,blip中的bj覆盖全局的bj.
但书上却标明是错误,是二义性.
麻烦各位帮忙解释一下了. 谢谢!

[解决办法]
当然有二义性了。
using namespace blip;把命名空间blip的变量引进来的,这样就有两个bj的定义。
++blip::bj;
[解决办法]
方法外定义了一个变量,在方法内又定义了一个同名变量,这也错误吗?
不是错误,是局部变量隐藏了全局变量.

而名字空间不一样

[解决办法]
using namespace blip只是一个使用指示而已,而使用指示并不为局部作用域引进任何新名字,只是简单的使有关名字空间(这里是blip)中的所有名字都成为可以访问的。(关于这个,请看BS的《C++设计与演化》也就是D&E的17.4)
如果你要把blip中的bi引进到函数的局部作用域,那么你应该使用的是使用声明而不是使用指示,也就是把using namespace blip换成using blip::bi。一个使用声明在一个局部作用域为它所提出的名字引进了一个同义词。(同样请看BS的《C++设计与演化》也就是D&E的17.4))

读书人网 >C++

热点推荐