我是C ++的新手。
我有一个包含以下内容的文件:
namespace A {
namespace B {
function foo() {
}
}
function bar() {
}
}
,另一个文件包含以下内容:
namespace A {
namespace C {
// Call foo() and bar() here.
}
}
如果我想在命名空间C中调用foo和bar,我应该包含它们的绝对命名空间吗?
A::B::foo();
A::bar();
或者我不必包含名称空间A,因为它们都在A?
中B::foo();
bar();
答案 0 :(得分:2)
这是一个name lookup问题。
因此,如果你已经读过这篇文章,你就会知道Unqualified Lookup和Qualified Lookup
之间的区别很明显,不合格的查找在这里是有效的,但如果你想做一些明确的工作,你可以使用合格的查找。因此,当非限定查找有效时,限定查找始终有效。(如果可以使用限定查找)。
答案 1 :(得分:0)
只是一点点补充。正如Constructor所说,限定查找总是生成格式良好的代码,但该代码并不总能产生预期的结果。考虑这个消除歧义的例子
#include <iostream>
void foo();
void foo(float);
namespace Boo {
using ::foo;
void foo(int a) { std::cout << __PRETTY_FUNCTION__ << " is here!\n"; }
}
void foo() { std::cout << __PRETTY_FUNCTION__ << " is here!\n"; }
void foo(int a) { std::cout << __PRETTY_FUNCTION__ << " is here!\n"; }
void foo(float) { std::cout << __PRETTY_FUNCTION__ << " is here!\n"; }
using namespace Boo;
int main(int argc, char *argv[])
{
foo(); // no error!
Boo::foo(); // still same
//foo(3); // aw, there are three of them. Bad, bad `using namespace`!
Boo::foo(3);
Boo::foo(3.f);
return 0;
}
名称空间Boo
将名称foo
传播为Boo::foo
。我们在命名空间声明后定义了foo()
,但之前需要知道原型声明。
现在假设Boo
是std
,foo
原型与标准标题中的abs
或sin
类似,并以此方式声明。允许头部实现使用上面的技巧。重新定义标准名称空间中使用的名称的结果被描述为未确定,因为根据if using
是否在实现中,程序将使用标准或用户定义的函数而不考虑限定名称。
TL; DR:合格查找的结果始终是正确的,但如果不遵守保留名称,则并不总是很明确。