如果两个名称空间具有相同的变量名,会发生什么?

时间:2014-09-27 18:15:39

标签: c++

假设您有两个名称空间,并且两者都有一个具有相同名称的函数。如果你说“使用”两个命名空间,当你调用该函数时,它使用哪个命名空间的变量?

例如:

#include <library1>
#include <library2>

using namespace1;
using namespace2;

int main()
{
     myfunction(); //exists in both namespaces under the same name
}

调用哪个命名空间的函数?

2 个答案:

答案 0 :(得分:6)

如果函数在查找过程中具有相同的名称和签名(参数,而不是返回类型)(不合格),则不明确:

namespace A {   
 void fun() {
 }
}

namespace B {  
 void fun() {
 }
}

using namespace A;
using namespace B;

int main()
{
   fun(); // Ambiguous
}

See for yourself

编译器不知道哪一个应该用于预期的呼叫(如果你不调用任何一个,它就不会抱怨)。请注意,此问题正是命名空间旨在解决的问题。你永远不应该通过不加区别的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() {}
          ^