跨名称空间的typedef解析 我现在混淆了“使用(命名空间)”语句在C++中的用法。

跨名称空间的typedef解析 我现在混淆了“使用(命名空间)”语句在C++中的用法。,c++,namespaces,typedef,C++,Namespaces,Typedef,我有: //somewhere in included headers typedef unsigned int uint; namespace mine { typedef unsigned int uint; } namespace other { using namespace mine; void foobar () { uint offender = i; } } 结果(意译): 对“uint”的引用不明确。 候选人是 typedef

我有:

//somewhere in included headers
typedef unsigned int uint;

namespace mine {
    typedef unsigned int uint;
}
namespace other {
    using namespace mine;
    void foobar () {
        uint offender = i;
    }
}
结果(意译):
对“uint”的引用不明确。 候选人是
typedef unsigned int uint

typedef unsigned int mine::uint

与此同时,当我

namespace other {
    using namespace mine;
    using mine::uint;

    void foobar () {
        uint offender = i;
    }
}
一切正常。 我觉得奇怪的是,“使用标识符;”会改变其他typedef定义的可见性(隐藏全局定义?)。
有人可以指出,C++中的什么样的规则支配着命名空间中的类型错误?

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

::uint

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


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

它不会隐藏全局代码。这就是为什么你有歧义。

我不能为你举出章节,但这对我来说是有意义的。如果编译器在当前名称空间中找不到符号
uint
,它将查找其他名称空间以查看是否可以在那里找到符号。因为它在另外两个名称空间中找到它,所以它是不明确的

当您说
使用我的::uint
时,您将该符号导入到当前块中,因此在需要检查其他名称空间之前找到该符号。

由using指令显示的名称出现在最近的封闭范围中,该范围包含using指令和指定的名称空间[-直接或间接-]。(7.3.4[namespace.udir])

这意味着在
other
中的using指令之后查找时,两个
uint
声明都出现在全局命名空间范围中


using声明与任何其他声明一样,在名称出现的范围内声明名称。这就是为什么在第二个示例中,
使用mine::uint
使用名称空间mine隐藏
引入的
uint
因为后者似乎来自全局范围。

由于using指令(与using声明相反)而使声明可见的名称空间与中的问题完全相同,即“using mine::xxx”明确指定每当代码中出现xxx时,它都将解析为mine::xxx。“使用名称空间矿”对名称空间矿中的所有标识符不是都一样吗?我认为下面的答案足以回答您的问题。
::mine::uint