跨命名空间的typedef解析

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;因为后者似乎来自全球范围.


Peo*_*eat 5

您的原始代码会混淆编译器,因为 uint 可以是

::uint
Run Code Online (Sandbox Code Playgroud)

或者

::mine::uint
Run Code Online (Sandbox Code Playgroud)

因此编译器会向您抛出该错误消息。在“修复”中,mine::uint明确指定的使用::mine::uint应为首选。

但是,typedefIMO 应避免冲突。这使得代码很难维护。