I have the following code:
#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;
}
I found it strange that call_base_print(gchild)
works but call_print(gchild)
causes a compiler error. I know that C++ does not allow two implicit conversions, but I don't think there're two conversions here... Could anyone enlighten me?