C++: понижение и понижение между производным классом шаблона и базовым классом?

У меня возникли проблемы с преобразованием указателя на шаблонный производный класс в указатель базового класса для целей сохранения на карте (и, очевидно, для его извлечения позже). Я имею:

#include <map>
//Role.h
class RoleBase{};
enum class RoleEnum : int;

template<RoleEnum role>
class Role : public RoleBase{};

//Relationship.h
class Relationship{
public:
    template<RoleEnum role>
    Role<role>* getRole(){
    auto it=RoleMap.find(role);
    if ( it == RoleMap.end() ) {
       return nullptr;
    } else {
            RoleBase* roleBase= it->second;
            return static_cast<Role<role>* >(roleBase);
        }
    }
    std::map<RoleEnum,RoleBase*> RoleMap;
};

//squash.h
enum class RoleEnum : int
{
    Player,
    Referee
};

template<> class Role<RoleEnum::Player>{};
template<> class Role<RoleEnum::Referee>{};

class SquashGame: public Relationship{
public:
    SquashGame(){
        RoleBase* playerRole=new Role<RoleEnum::Player>; //problematic
        RoleMap.emplace(RoleEnum::Player,playerRole);
    }
};

int main() {
    SquashGame squashGame;
    squashGame.getRole<RoleEnum::Player>();
    return 0;
}

Почему это так, и есть ли способ исправить это, чтобы я мог создать шаблон класса со значениями перечисления для целей внешнего вызова getClass<Enum> функция, как мы надеемся, понятна в примере?

1 ответ

Решение

Проблема проста: ваше переопределение роли

template<> class Role<RoleEnum::Player> {}

Не расширяет RoleBase.

Либо удалите его, либо измените его на:

template<> class Role<RoleEnum::Player> : public RoleBase {}
Другие вопросы по тегам