使用shared_ptrs进行函数模板的C ++实例化

时间:2012-03-19 18:54:22

标签: c++ templates polymorphism shared-ptr instantiation

  

可能重复:
  C++ passing a derived class shared_ptr to a templated function

当我们使用指针时,编译器没有实例化问题。

template <typename T> struct Base{
  virtual ~Base() {}
};

template <typename T> struct Der: public Base<T> {
};


template <class T>
void f(Base<T>* b) {}

int main() {
  Der<int> x;
  f(&x);
}

但是,如果我将f更改为使用shared_ptrs,则编译器无法找到匹配项。

template <class T>
void f(shared_ptr<Base<T> >b) {}

int main() {
  shared_ptr<Der<int> > x(new Der<int>);
  f(x);
}

Z.cc: In function ‘int main()’:
Z.cc:45: error: no matching function for call to ‘f(std::tr1::shared_ptr<Der<int> >&)’

将x更改为

shared_ptr<Base<int> > x(new Der<int>);

也会奏效。 为什么这种行为存在差异?

1 个答案:

答案 0 :(得分:0)

shared_ptr<Der<int>>无法隐式转换为shared_ptr<Base<int>>,而Der<int>*可隐式转换为Base<int>*。 C ++不会自动使模板从可转换的模板实例化,因为模板参数类型碰巧是可转换的,因为这不一定有意义并且可能是危险的。

http://www2.research.att.com/~bs/bs_faq2.html#conversion