2017-10-10 58 views
4

我明白爲什麼如果沒有使用名稱空間,以下將是一個問題。這個電話確實是模棱兩可的。我以爲「使用stD :: swap;」會定義使用哪種方法。重載函數的調用是不明確的,雖然不同的命名空間

爲什麼它適用於「int」而不是「class」?

#include <memory> 

    namespace TEST { 

    class Dummy{}; 

    void swap(Dummy a){}; 
    void sw(int x){}; 

    } 

    namespace stD { 

    void swap(TEST::Dummy a){}; 
    void sw(int x){}; 

    class aClass{ 
    public: 
     void F() 
     { 
      using stD::swap; 
      TEST::Dummy x; 
      swap(x); 
     } 

     void I() 
     { 
      using stD::sw; 
      int b = 0; 
      sw(b); 
     } 
    }; 

    } 

這是錯誤消息:

../src/Test.h: In member function ‘void stD::aClass::F()’: 
    ../src/Test.h:26:9: error: call of overloaded ‘swap(TEST::Dummy&)’ is ambiguous 
     swap(x); 
      ^
    ../src/Test.h:26:9: note: candidates are: 
    ../src/Test.h:17:6: note: void stD::swap(TEST::Dummy) 
    void swap(TEST::Dummy a){}; 
     ^
    ../src/Test.h:10:6: note: void TEST::swap(TEST::Dummy) 
    void swap(Dummy a){}; 
     ^

我非常感謝你提前一個答案。

回答

7

這行運用argument dependent lookup

TEST::Dummy x; 
swap(x); 

所以將找到void stD::swap(TEST::Dummy)以及void TEST::swap(TEST::Dummy)因爲x攜帶TEST::命名空間。

在後一種情況下int b = 0;變量b沒有命名空間,所以唯一有效的函數調用將stD::sw因您的using聲明。

+0

值得一提的是,如果'F'不在'stD'中,它會調用'TEST :: swap'。 – Rakete1111

+0

謝謝!這完全回答了我的問題。現在這很清楚。 – Lycosa

相關問題