¿Por qué shared_ptr no puede resolver las relaciones de herencia en la interfaz de función?
Aquí hay unejemplo simplificado:
#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
}
Con o sin boost, cualquiera que sea el compilador que use, obtengo un error en el # 1 porqueshared_ptr<KBOOM>
no heredar deshared_ptr<K<int>>
. Sin embargo,KBOOM
se hereda deK<int>
. Puede ver que el # 2 funciona porque shared_ptr está diseñado para permitir pasar de forma implícita un puntero de clase secundaria a un puntero de clase base, como punteros en bruto.
Así que mis preguntas son:
qué impide que el implementador std :: shared_ptr lo haga funcionar en el caso # 1 (es decir, suponiendo que la norma previene este caso, debería haber una razón);¿hay una manera de escribirauto kboom = std::make_shared<KBOUM>(); do_something( kboom );
¿Sin mirar el tipo int de K de donde KBOOM hereda?Nota: quieroevitar El usuario de la función tiene que escribir.
std::shared_ptr<K<int>> k = std::make_shared<KBOOM>();
o
do_something( std::shared_ptr<K<int>>( kboom ) );