阅读The C++ Programming Language 第 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: 变量
巴兹: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
.