2017-08-10 13 views
1

同じ関数で2つの異なる名前空間を使用して完全修飾名空間なしのusing namespaceディレクティブを使用すると、エラーメッセージ(エラー:オーバーロードされた呼び出しがあいまいです。同じ関数内で別の名前空間を使用する

#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に必要なだけの識別子をで引っ張ってみてください:だから、それぞれによって導入されたシンボルの可用性を制限するために、新しいブロックスコープを導入することができます代わりに宣言。例えばあなたがしかfirstからクラスfooを使用したい場合は、以下であいまいはないだろう:

using first::foo; 
using namespace second; 
3

using namespace ...ディレクティブは、注文したパスを作成していない何も問題はありません。以前のものを上書きすることもありません。だから、あなたのコードはあいまいな状況を作り出します。

1

最初にnamespace firstを使用すると、最初の名前空間のmyCoutが導入されます。次にnamespace secondを使用すると、もう一方のmyCoutも再生されます。 2番目のネームスペースは、は前のネームスペースのを上書きしません。

結果として、myCoutを2回目に呼び出すと、2つの定義が再生され、コンパイラがこれをあいまいな呼び出しとみなします。すなわち

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; 
} 
関連する問題