2012-03-19 59 views
3

可能重複:
C++ passing a derived class shared_ptr to a templated functionC++實例與shared_ptrs

編譯器有沒有問題實例,當我們使用指針。

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>); 

也會起作用。 爲什麼有這種行爲差異?

+0

誰能告訴我,爲什麼在重複的問題的答案將富來調用了foo 奇蹟般地使事情的工作? – ATemp 2012-03-19 19:45:29

回答

0

shared_ptr<Der<int>>不能隱式轉換爲shared_ptr<Base<int>>Der<int>*可以隱式轉換爲Base<int>*。由於模板參數類型恰好是可轉換的,C++不會自動將模板從可轉換的模板中實例化,因爲這樣做不一定有意義並且可能是危險的。

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