C++模板和隐式类型转换

Hon*_*ang 4 c++

我有以下代码:

#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++不允许两次隐式转换,但我不认为这里有两次转换......任何人都可以启发我吗?

MSa*_*ers 5

你没有达到类型转换的程度.它在模板实例化中更早失败.

call_base_print不需要类型扣除.call_print<T>(shared_ptr<Child<T> > a)确实.你通过了shared_ptr<GrandChild>.并且没有T你可以替代这样shared_ptr<Child<T> >shared_ptr<GrandChild>.因此,实例化失败,并且没有调用函数.