0
지도에 저장하는 목적으로 템플릿 기반 파생 클래스에 대한 포인터를 기본 클래스 포인터로 변환하는 데 문제가 있습니다 (그리고 나중에 분명히 검색하는 것입니다). 내가 가진 :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>
기능에 의해 외부 호출의 목적을 위해 열거 값 클래스를 템플릿 수 있다는 고정하는 방법이?
헥타르! 그렇다면 컴파일러가 잘못된 템플릿 전문화에 대해 경고하지 않는 이유는 무엇입니까? 어떤 사람들은이 역할들이 컴파일러에 의해 어떻게 해석되는지를 추측한다. – ShS
템플릿은 템플릿을 사용할 때 인스턴스화되며 템플릿이 인스턴스화되면 [memoized] (https://en.wikipedia.org/wiki/Memoization)입니다. –
템플릿을 전문화하면 컴파일러는 자체적으로 새 정의를 만드는 대신 정의를 사용합니다. –