2017-08-10 74 views
1

为什么我在使用using namespace指令而不使用完全限定名称空间的情况下在相同函数中使用两个不同名称空间时出现错误消息(错误:超载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()如下面给出的,没有问题

int main(void) 
{ 
    cout<<"Hello World\n"; 
    using namespace first; 
    myCout(); 
    second::myCout(); 
    return(0); 
} 
+0

你'使用第二个命名空间后,',有myCout'的'2点的定义,与相同的签名,在'main'的范围内,因此 - 调用是不明确的。 –

回答

5

using指令尊重范围。所以,你可以引入一个新的块范围来限制每个引入的符号的可用性:

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

    { 
     using namespace second; 
     myCout(); 
    } 

    return(0); 
} 

正常,从而避免冲突和深度嵌套,尝试只是你需要用一个using标识符拉而不是声明。例如如果你只曾经想使用foo类从first那么就不会有用以下毫不含糊:

using first::foo; 
using namespace second; 
3

using namespace ...指令不创建一个有序的路径;也不会覆盖以前的所有内容。所以,是的,你的代码创建了一个模糊的情况。

1

首先您使用namespace first,因此引入了第一个名称空间的myCout。然后您使用namespace second,导致其他myCout也发挥作用。第二个命名空间不会覆盖以前的命名空间

因此,当您第二次致电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; 
} 
相关问题