Почему shared_ptr не может разрешить отношения наследования в интерфейсе функций?
#include <memory>
#include <vector>
template< class T >
class K
{
public:
virtual ~K(){}
};
class KBOUM : public K<int>{};
template< class U >
void do_something( std::shared_ptr< K<U> > k ) { }
int main()
{
auto kboom = std::make_shared<KBOUM>();
do_something( kboom ); // 1 : error
std::shared_ptr< K<int> > k = kboom; // 2 : ok
do_something( k ); // 3 : ok
}
С или без наддува, какой бы компилятор я не использовал, я получаю сообщение об ошибке # 1shared_ptr<KBOOM>
не наследуй отshared_ptr<K<int>>
, Тем не мение,KBOOM
наследуется отK<int>
, Вы можете видеть, что # 2 работает, потому что shared_ptr предназначен для неявной передачи указателя дочернего класса на указатель базового класса, как необработанные указатели.
Итак, мои вопросы:
что мешает реализации std :: shared_ptr, чтобы она работала в случае № 1 (я имею в виду, если стандарт предотвращает этот случай, должна быть причина);есть ли способ написатьauto kboom = std::make_shared<KBOUM>(); do_something( kboom );
не смотря тип int от K, от которого наследуется KBOOM?Примечание: я хочуизбежать пользователь функции должен написать
std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();
или же
do_something( std::shared_ptr<K<int>>( kboom ) );