2014-06-13 80 views
-2

我有以下代碼:自動轉換爲參考?

#include <iostream> 

template<typename T> 
void gaga(T * a){ 
    std::cout << "gaga(T * a)"; 
} 

template<typename T> class A{}; 

template<typename T> 
void gaga(A<T> & a){ 
    std::cout << "gaga(A<T> & a)\n"; 
} 

template<typename T> 
class B { 
public: 

    T * p; 

    operator T*() const{ 
     std::cout << "Cast called" <<std::endl; 
     return p; 
    } 
}; 

int main() 
{ 
    B< A<int> > b; 
    gaga(*b); /// WHAT IS GOING ON HERE? WHY is void gaga(A<T> & a) CALLED? 

    A<int> * p; 
    gaga(p); /// WHEN THE ABOVE calls void gaga(A<T> & a) WHY is here 
      /// void gaga(T * a) CALLED??? 
} 

,我真的很困惑,爲什麼gaga(A<T> & a)被稱爲當我*b叫它這顯然由轉換操作導致A<T> *但爲什麼? --->*b是一個解引用運算符,甚至沒有定義!??爲什麼可以交給gaga(A<T> & a)

感謝您的解釋!

+0

什麼是'AA'?... – Brian

+0

對不起編輯過的東西,AA應該是A – Gabriel

+0

你知道'operator T *()const'的行嗎? –

回答

2

好吧,b是B型的一個B型< A> b,因爲你添加了轉換運算符,所以可以轉換爲T *,這意味着它可以轉換爲A *。

當調用解引用運算符時,您會看到* b變成了A,所以很明顯第二個gaga被調用,因爲它有一個引用作爲參數。

在第二種情況下,它更加明顯。你有一個指向A的指針,它將與唯一一個將指針作爲參數的加加函數相匹配,即第一個。