我有以下代码:
#include <iostream>
#include "boost/shared_ptr.hpp"
using boost::shared_ptr;
class Base {
public:
virtual ~Base() {}
virtual void print() = 0;
};
template <typename T>
class Child : public Base {
public:
virtual void print() {
std::cout << "in Child" << std::endl;
}
};
class GrandChild : public Child<int> {
public:
virtual void print() {
std::cout << "in GrandChild" << std::endl;
}
};
template <typename T>
void call_print(shared_ptr<Child<T> > a) {
a->print();
}
void call_base_print(shared_ptr<Base> a) {
a->print();
}
int main() {
shared_ptr<GrandChild> gchild(new GrandChild);
call_print(shared_ptr<Child<int> >(gchild));
// call_print(gchild); // Cannot compile!
call_base_print(gchild); // This works.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现它很奇怪call_base_print(gchild)但是call_print(gchild)会导致编译错误.我知道C++不允许两次隐式转换,但我不认为这里有两次转换......任何人都可以启发我吗?
你没有达到类型转换的程度.它在模板实例化中更早失败.
call_base_print不需要类型扣除.call_print<T>(shared_ptr<Child<T> > a)确实.你通过了shared_ptr<GrandChild>.并且没有T你可以替代这样shared_ptr<Child<T> >的shared_ptr<GrandChild>.因此,实例化失败,并且没有调用函数.