2014-06-13 1 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??? 
} 

을 내가 분명히 A<T> * 그런데 왜의 변환 연산자에 의해 발생하는 *b로를 호출 할 때 난 정말 왜 gaga(A<T> & a)가 호출 의아해하고있다 ?? --->*b은 역 참조 연산자조차도 정의되지 않았습니다! 왜 그걸 gaga(A<T> & a)에게 건네 줄 수 있습니까?

설명해 주셔서 감사합니다.

+0

'AA'란 무엇입니까? ... – Brian

+0

죄송합니다. AA는 A이어야합니다. – Gabriel

+0

'연산자 T *() const' 줄은 무엇을 알고 있습니까? –

답변

2

음, b는 사용자가 추가 한 변환 연산자로 인해 A *로 변환 될 수있는 B * 유형 B < A> b입니다.

역 참조 연산자를 호출하면 * b가 A가되므로 두 번째 가가 호출됨을 확실히 알 수 있습니다. 참조가 매개 변수로 사용됩니다.

두 번째 경우에는 더욱 분명합니다. 당신은 A에 대한 포인터를 가지고 있습니다. 그것은 포인터를 인자로 취하는 유일한 가가 함수와 일치합니다, 첫 번째 인수.