Mar*_*n K 9 c++ typedef namespaces
我目前对"使用(命名空间)"语句在C++中的工作方式感到困惑.
我有:
//somewhere in included headers
typedef unsigned int uint;
namespace mine {
typedef unsigned int uint;
}
namespace other {
using namespace mine;
void foobar () {
uint offender = i;
}
}
Run Code Online (Sandbox Code Playgroud)
结果(转述):
对'uint'的引用含糊不清.候选者是
typedef unsigned int uint
和
typedef unsigned int mine :: uint
同时,当我这样做的时候
namespace other {
using namespace mine;
using mine::uint;
void foobar () {
uint offender = i;
}
}
Run Code Online (Sandbox Code Playgroud)
一切正常."使用标识符 " 对我来说似乎很奇怪 更改其他typedef定义的可见性(隐藏全局定义?).有人能指出我用C++中的哪种规则管理跨命名空间的typedef解析?
CB *_*ley 12
using-directive使可见的名称出现在最近的封闭范围中,该范围包含[ - 直接或间接 - ] using-directive和指定的命名空间.(7.3.4 [namespace.udir])
这意味着,uint
声明出现在全局命名空间范围时后抬头using指令在other
.
一个using声明,像任何其他声明,宣布在它出现的范围的名称.这就是为什么在第二个例子中using mine::uint;
隐藏uint
引入的,using namespace mine;
因为后者似乎来自全球范围.
您的原始代码会混淆编译器,因为 uint 可以是
::uint
Run Code Online (Sandbox Code Playgroud)
或者
::mine::uint
Run Code Online (Sandbox Code Playgroud)
因此编译器会向您抛出该错误消息。在“修复”中,mine::uint
明确指定的使用::mine::uint
应为首选。
但是,typedef
IMO 应避免冲突。这使得代码很难维护。
归档时间: |
|
查看次数: |
16237 次 |
最近记录: |