假设您有两个名称空间,并且两者都有一个具有相同名称的函数。如果你说“使用”两个命名空间,当你调用该函数时,它使用哪个命名空间的变量?
例如:
#include <library1>
#include <library2>
using namespace1;
using namespace2;
int main()
{
myfunction(); //exists in both namespaces under the same name
}
调用哪个命名空间的函数?
答案 0 :(得分:6)
如果函数在查找过程中具有相同的名称和签名(参数,而不是返回类型)(不合格),则不明确:
namespace A {
void fun() {
}
}
namespace B {
void fun() {
}
}
using namespace A;
using namespace B;
int main()
{
fun(); // Ambiguous
}
编译器不知道哪一个应该用于预期的呼叫(如果你不调用任何一个,它就不会抱怨)。请注意,此问题正是命名空间旨在解决的问题。你永远不应该通过不加区别的using namespace
东西污染全局命名空间,并且作为一个好的经验法则,通常更好地限定你正在使用的函数(也是为了可读性)。
答案 1 :(得分:2)
myfunction
的名称查找是不明确的,C ++编译器将拒绝编译它。
e.g:
namespace namespace1 {
void myfunction() {}
}
namespace namespace2 {
void myfunction() {}
}
using namespace namespace1;
using namespace namespace2;
int main()
{
myfunction();
}
$ g++ t.cpp
t.cpp: In function ‘int main()’:
t.cpp:14:17: error: call of overloaded ‘myfunction()’ is ambiguous
myfunction();
^
t.cpp:14:17: note: candidates are:
t.cpp:6:10: note: void namespace2::myfunction()
void myfunction() {}
^
t.cpp:2:10: note: void namespace1::myfunction()
void myfunction() {}
^