Non riesco a risolvere questo problema. Diciamo che ho questo vettoreConversione da shared_ptr a weak_ptr polymorphism
std::vector<std::shared_ptr<Car>> cars;
Car è una classe astratta. Voglio essere in grado di restituire puntatori deboli di tipi diversi, quindi faccio quanto segue.
template<typename T>
std::weak_ptr<T> GetCar()
{
for (std::vector<std::shared_ptr<Car>>::iterator it = cars.begin(); it != cars.end(); ++it)
{
T* derived = dynamic_cast<T*>((*it).get());
if (derived != nullptr)
{
std::weak_ptr<T> carPointer = *it;
return carPointer;
}
}
return std::weak_ptr<T>();
}
Viene visualizzato il seguente errore quando si tenta di utilizzare la funzione con una classe che eredita da Car. Error C2440 'initializing': cannot convert from 'std::shared_ptr<Car>' to 'std::weak_ptr<Saab>'
Potrebbe non esserci una macchina valida quando richiesto. Ho provato a usare boost :: facoltativo ma non gestisce il polimorfismo. Potrei andare con i puntatori grezzi se non riesco a farlo funzionare.
Il tipo puntato da 'shared_ptr' e' weak_ptr' deve essere lo stesso. Lo farei in tre passaggi: restituire un 'weak_ptr' e convertirlo in un 'shared_ptr ', quindi in un 'T *'. –
Grazie per la risposta rapida @MarkRansom Mmm. Questo è per una funzione utente di una libreria, quindi preferirei non dare allo sviluppatore che potrebbe usarlo più lavoro. Avrei dovuto dirlo, mio male. Consiglieresti di lavorare solo con i puntatori grezzi in modo da poterne restituire uno? Oppure restituire derivato pari, – miniconco
Puoi certamente avere una singola funzione che esegue tutti e tre i passaggi, ma lo scopo di convertire un 'weak_ptr' in un' shared_ptr' è di mantenere vivo l'oggetto mentre stai lavorando con esso; mettere il 'shared_ptr' in una sconfitta temporanea a tale scopo. –