C++ 在同一函数中使用不同的命名空间

C++ 在同一函数中使用不同的命名空间,c++,function,oop,namespaces,C++,Function,Oop,Namespaces,当我在同一个函数中使用usingnamespace指令而没有完全限定的名称空间时,为什么会收到错误消息(错误:重载的myCout()调用不明确) #include <iostream> using namespace std; namespace first { void myCout(void) { cout<<"Hello World is great\n"; } } namespace second { voi

当我在同一个函数中使用
usingnamespace
指令而没有完全限定的名称空间时,为什么会收到错误消息(错误:重载的
myCout()
调用不明确)

#include <iostream>
using namespace std;

namespace first
{
     void myCout(void)
    {
        cout<<"Hello World is great\n";
    }
}

namespace second
{
     void myCout(void)
    {
        cout<<"Hello Sky is high\n";
    }
}

    int main(void)
    {

        cout<<"Hello World\n";
        using namespace first;
            myCout();

        using namespace second;
            myCout();

        return(0);
    }

使用名称空间…
指令不会创建有序路径;它们也不会覆盖以前的所有规则。因此,是的,您的代码创建了一个模棱两可的情况

首先使用
名称空间优先
,因此引入了第一个名称空间的
myCout
。然后使用
namespace second
,使另一个
myout
也起作用。第二个命名空间不覆盖前一个命名空间

因此,当您第二次调用
myCout
时,有两个定义起作用,导致编译器将其视为不明确的调用

换言之:

int main(void)
{
    using namespace first;  // `myCout` of the 1st namespace is introduced
    myCout();

    using namespace second; // `myCout` of the 2nd namespace is introduced
    // and does not override the first namespace!

    myCout();               // Which `myCout`? Of the first or second?

    return 0;
}

使用指令尊重范围。因此,您可以引入新的块范围,以限制每个块引入的符号的可用性:

int main(void)
{
    cout<<"Hello World\n";
    {
        using namespace first;
        myCout();
    }

    {
        using namespace second;
        myCout();
    }

    return(0);
}

在您使用命名空间第二次执行
之后
,在
main
的范围内有两个具有相同签名的
myout
定义,因此-调用不明确。
int main(void)
{
    cout<<"Hello World\n";
    {
        using namespace first;
        myCout();
    }

    {
        using namespace second;
        myCout();
    }

    return(0);
}
using first::foo;
using namespace second;