Frage zu shared_ptr aus der boost library und explicit cast



  • Hallo zusammen!

    Ich habe folgendes Stück Code

    bool cBoard::addField(cFieldPtr field)
    {
    	// ....
    	if (field->isTarget())
    		mTargets.push_back( (cTargetFieldPtr) field ); // error C2440
    
    	return true;	
    }
    

    Dabei ist deklariert

    typedef boost::shared_ptr< cField > cFieldPtr;
    
          class cTargetField : public cField
          typedef boost::shared_ptr< cTargetField > cTargetFieldPtr;
    
          std::vector< cTargetFieldPtr > mTargets;
    

    Offenbar funktioniert ein explizites Casting von shared_ptr nicht, wie ich es eigentlich gedacht habe. Der Microsoft Compiler gibt mir Fehler C2440 beim Kompilieren:

    error C2440: 'Initialisierung': 'nclib::adt::cField *const ' kann nicht in 'nclib::adt::cTargetField *' konvertiert werden
    Umwandlung von der Basis in die Ableitung erfordert 'dynamic_cast' oder 'static_cast'
    

    Stelle ich cTargetField* in den Vektor und benutze field.get(), so funktioniert es natürlich.

    Ist es per se nicht möglich, explizit zu casten bei shared_ptr oder mache ich hier etwas falsch?



  • Die Boost Smart-Ptr bieten eigene Methoden zum Casten:

    http://boost.org/libs/smart_ptr/shared_ptr.htm#static_pointer_cast



  • Funktioniert, besten Dank!


Anmelden zum Antworten