1

I am trying to perform the following cast and I can't find a way either in the QT documentation or online to make this dynamic cast work which has been confusing:

class Entity : public QSharedData
{
  public:
    typedef QExplicitlySharedDataPointer<Entity> Pointer;
    typedef QExplicitlySharedDataPointer<const Entity> ConstPointer;
...
}

class EntityExtended : public Entity
{
public:
    typedef QExplicitlySharedDataPointer<EntityExtended> Pointer;
    typedef QExplicitlySharedDataPointer<const EntityExtended> ConstPointer;
...
}



bool SomeClass::createEntity(const Entity::ConstPointer entity)
{
  auto extendedEntity = dynamic_cast<const EntityExtended::ConstPointer>(entity);
}

The above produces the error:

error C2680: 'const EntityExtended::ConstPointer': invalid target type for dynamic_cast
note: target type must be a pointer or reference to a defined class

What am I missing?

Klypto
  • 434
  • 1
  • 3
  • 14

1 Answers1

1

The problem is that you can only use dynamic_cast on raw pointers. Even though QExplicitlySharedDataPointer is a class that's meant to be used like a pointer, it's not a raw pointer, so you can't use dynamic_cast on it.

The solution is to get the raw pointer using QExplicitlySharedDataPointer's data() or constData() methods, and use dynamic_cast on the raw pointer instead. You can then convert it back to a QExplicitlySharedDataPointer by passing the raw pointer to the QExplicitlySharedDataPointer constructor:

bool SomeClass::createEntity(const Entity::ConstPointer entity)
{
  //Create a raw pointer to use with dynamic_cast
  const EntityExtended *rawPointer = dynamic_cast<const EntityExtended*>(entity.constData());

  //Convert the raw pointer back to a QExplicitlySharedDataPointer
  EntityExtended::ConstPointer extendedEntity = EntityExtended::ConstPointer(rawPointer);

  if(extendedEntity == nullptr){
      //*entity is not an instance of ExtendedEntity
  }
  else{
      //*entity is an instance of ExtendedEntity
  }
}
Donald Duck
  • 8,409
  • 22
  • 75
  • 99