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>函数外部调用的目的,希望在示例中清楚?

问题很简单:你对角色的重新定义

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

不扩展RoleBase

将其删除或更改为:

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

最新更新