Warum kann shared_ptr Vererbungsbeziehungen in der Funktionsschnittstelle nicht auflösen?
Hier ist einvereinfachtes Beispiel:
#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
}
Unabhängig davon, welchen Compiler ich verwende, erhalte ich mit oder ohne Boost einen Fehler auf # 1, weilshared_ptr<KBOOM>
nicht erben vonshared_ptr<K<int>>
. Jedoch,KBOOM
erbt vonK<int>
. Sie können sehen, dass # 2 funktioniert, da shared_ptr so konzipiert ist, dass implizit ein untergeordneter Klassenzeiger an einen Basisklassenzeiger übergeben werden kann, z. B. rohe Zeiger.
Meine Fragen sind also:
Was verhindert, dass der Implementierer std :: shared_ptr in Fall 1 funktioniert? (Ich meine, wenn der Standard diesen Fall verhindert, sollte es einen Grund geben.)gibt es eine möglichkeit zu schreibenauto kboom = std::make_shared<KBOUM>(); do_something( kboom );
ohne nach dem int-Typ von K zu suchen, von dem KBOOM erbt?Hinweis: Ich möchtevermeiden der Benutzer der Funktion muss schreiben
std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();
oder
do_something( std::shared_ptr<K<int>>( kboom ) );