2012-03-19 9 views
3

可能性の重複:私たちは、ポインタを使用する場合
C++ passing a derived class shared_ptr to a templated functionC++インスタンス化

は、コンパイラは、インスタンス化には問題がありません。

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

ただし、shared_ptrsを使用するようにfを変更した場合、コンパイラは一致するものを見つけることができません。

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

にXを変更

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> >&)’ 

も動作します。 この動作の違いはなぜですか?

+0

重複質問の答えに呼び出しfooのにはFooを追加すると、魔法のように物事が動作しますなぜ誰かが私に言うことはできますか? – ATemp

答えて

0

shared_ptr<Der<int>>は暗黙的にshared_ptr<Base<int>>に変換可能ではありませんが、Der<int>*は暗黙的にBase<int>*に変換可能です。 C++では、テンプレートパラメータの型が変換可能になるだけで、変換可能なテンプレートからインスタンス化された型は自動的には変換されません。これは必ずしも意味をなさないので危険な可能性があるからです。

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

関連する問題