我有以下代码:
#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> *
中的转换运算符引起的,但为什么呢? ---&GT; *b
是一个甚至没有定义的解引用运算符!??为什么甚至可以交给gaga(A<T> & a)
?
感谢您的解释!
答案 0 :(得分:2)
嗯,b是B型中的一个&lt; A&gt; b可以转换为T *,因为你添加了转换运算符,这意味着它可以转换为A *。
当调用dereference运算符时,你会看到* b变为A,所以很明显第二个gaga被调用,因为它有一个引用作为参数。
在第二种情况下,它更加明显。你有一个指向A的指针,它将与唯一一个以指针作为参数的gaga函数匹配,第一个。