ho visto alcune delle altre domande su questo argomento, ma non hanno ancora trovato la risposta - Credo che mi manca qualcosa:Come implementare il polimorfismo con std :: shared_ptr?
Ho definito due semplici classi di test:
class TestBase
{
public:
TestBase () { };
~ TestBase () { };
protected:
inline virtual int getInt ()
{
return 0;
}
};
class TestDerived : public TestBase
{
protected:
inline int getInt () override
{
return 1;
}
};
ho dichiarato typedef per semplificare il loro utilizzo con std::shared_ptr:
typedef std::shared_ptr<TestBase> spBase;
typedef std::shared_ptr<TestDerived> spDerived;
Problema: non riesco a compilare il codice per utilizzare questi shared_ptr
dichiarazioni polymorphi Cally, anche se base
in tutti questi casi è in realtà un esempio di spDerived
:
spBase base; spDerived derived = static_cast <spDerived> (base);
error: no matching function for call to ‘std::shared_ptr::shared_ptr(spBase&)
spDerived derived = dynamic_cast <spDerived> (base);
error: cannot dynamic_cast ‘base’ (of type ‘spBase {aka class std::shared_ptr}’) to type ‘spDerived {aka class std::shared_ptr}’ (target is not pointer or reference)
spDerived derived = static_pointer_cast <spDerived> (base);
error: conversion from ‘std::shared_ptr >’ to non-scalar type ‘spDerived {aka std::shared_ptr}’ requested
spDerived derived = dynamic_pointer_cast <spDerived> (base);
error: conversion from ‘std::shared_ptr >’ to non-scalar type ‘spDerived {aka std::shared_ptr}’ requested
sto usando C++ 11 su una casella di Ubuntu 14.04 con la catena strumento di GCC di default. Il compilatore è gcc-4.9. Cosa sto sbagliando? Non è possibile utilizzare un parametro shared_pointer in modo polimorfico?
'static_pointer_cast (base)' –
Questo è il motivo typedef genere sono una pessima idea. Rendono il codice molto più confuso. – Puppy
@Puppy - Odio così tanto la digitazione, ma temo che tu abbia ragione. – Vector