【发布时间】:2014-08-07 17:20:49
【问题描述】:
有一段引述。 3.4.3.2/3:
给定 X::m(其中 X 是用户声明的命名空间),或给定 ::m(其中 X 是全局命名空间),如果 S(X, m) 是空集,则程序 格式不正确。 否则,如果 S(X, m) 只有一个成员,或者如果 引用的上下文是一个使用声明 (7.3.3), S(X, m) 是 m 的必需声明集。
S(X,m) 的定义如下。 3.4.3.2/2:
对于命名空间 X 和名称 m,命名空间限定的查找集 S(X, m) 定义如下:令 S (X, m) 为所有声明的集合 X 中的 m 和 X 的内联命名空间集(7.3.1)。如果 S (X, m) 是 不为空,S(X, m) 为 S(X, m);否则,S(X, m) 是 S(Ni , m) 用于通过 X 中的 using 指令指定的所有命名空间 Ni 和 它的内联命名空间集。
现在考虑以下代码:
#include <iostream>
using namespace std;
namespace N
{
int cout = 6;
}
using namespace N;
int main() {
using ::cout;//error: reference to ‘cout’ is ambiguous
return 0;
}
我不明白这个错误。上面的代码不违反规则:
如果 S(X, m) 只有一个成员,或者如果引用的上下文 是一个使用声明(7.3.3),S(X,m)是所需的集合 m 的声明。
你能解释一下这条规则的含义吗?
【问题讨论】:
-
您忘记提及您预期要识别的
using子句中的哪个cout。 -
对于函数,一组所有具有多个值的声明(可能)没有冲突和歧义,对于类和对象实例,您想要哪个是不明确的。
标签: c++ namespaces language-lawyer