Dlaczego shared_ptr nie może rozwiązać relacji dziedziczenia w interfejsie funkcji?
Tutaj jestuproszczony przykład:
#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
}
Z lub bez doładowania, niezależnie od tego, jakiego kompilatora używam, pojawia się błąd # 1, ponieważshared_ptr<KBOOM>
nie dziedziczę poshared_ptr<K<int>>
. Jednak,KBOOM
dziedziczy zK<int>
. Widać, że # 2 działa, ponieważ shared_ptr jest zaprojektowany, aby umożliwić niejawne przekazanie wskaźnika klasy podrzędnej do wskaźnika klasy bazowej, jak surowe wskaźniki.
Moje pytania to:
co uniemożliwia implementatorowi std :: shared_ptr, aby działał w przypadku # 1 (mam na myśli, zakładając, że standard uniemożliwia ten przypadek, powinien istnieć powód);czy istnieje sposób na pisanieauto kboom = std::make_shared<KBOUM>(); do_something( kboom );
bez szukania typu int z K, z którego dziedziczy KBOOM?Uwaga: chcęuniknąć użytkownik funkcji musi pisać
std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();
lub
do_something( std::shared_ptr<K<int>>( kboom ) );