2012-03-19 4 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> >&)’ 

Изменение х в

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

также будет работать. Почему это различие в поведении?

+0

Может кто-нибудь сказать мне, почему добавление 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

Смежные вопросы