【发布时间】:2018-07-18 08:30:14
【问题描述】:
读完C++ 编程语言第 4 版(第 14.4.4 节 - 合成和选择)我认为以下程序可以正确编译:
#include <iostream>
namespace foo {
int var = 0;
// more declarations
}
namespace bar {
int var = 1;
// more declarations
}
namespace baz {
// composition of namespaces foo and bar
using namespace foo;
using namespace bar;
// I thought that the following line would resolve the name clash
using foo::var;
}
using namespace baz;
void qux(int n) {
if (n == var) {
std::cout << "baz: var " << std::endl;
} else {
std::cout << "baz: " << n << std::endl;
}
}
int main() {
qux(0);
qux(1);
}
预期的输出应该是
baz: 变量
baz: 1
当我尝试编译上面的代码时,我收到一条错误消息,指出对“var”的引用不明确。使用foo::var 消除了编译错误,但我想更好地理解这个问题。
我的代码有什么问题?
如何以命名空间 baz 包含 foo::var 的方式解决名称冲突?
谢谢!
编辑
正如以下答案中所建议的,将 qux 的定义移动到命名空间 baz 内使其有效。因此,以下代码按预期编译
#include <iostream>
namespace foo {
int end = 0;
}
namespace bar {
int end = 1;
}
namespace baz {
using namespace foo;
using namespace bar;
using foo::end;
void qux(int n) {
if (n == end) {
std::cout << "baz: end " << std::endl;
} else {
std::cout << "baz: " << n << std::endl;
}
}
}
int main() {
baz::qux(baz::end);
baz::qux(1);
}
还有一件事我并不完全清楚。我认为添加using namespace baz 将使baz 中的所有内容在当前范围内也可用,而无需使用baz::。换句话说,我原以为“一切都在命名空间 baz 中有效”,在添加 using namespace baz 后,在当前范围内也是如此。
【问题讨论】:
-
不要使用
using namespace xxxx -
虽然我不同意@NathanOliver 的观点,但我 1) 被可能比我更好的程序员投票否决,并且 2) 我会从不使用命名空间组合可能必须像您尝试做的那样解决。 (即使它是可能的,它可能是,虽然我怀疑)
-
@zzxyz 我在使用
using namespace xxxx时遇到了一些错误/错误。一个非常不直观。在被烧了几次之后,我刚刚决定完全限定这些名字更安全。您可以为命名空间名称命名以减少输入。 -
@zzxyz:
using std::string; using std::vector;(etc.) 使 STL 代码同样出色,并且不会导致您不知道的名称冲突。 -
@zzxyz:所以使用第二个。
using不是邪恶的,除非它出现在全局范围内并且后面跟着namespace。
标签: c++ using using-directives using-declaration