2016-11-05 2 views
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> 기능에 의해 외부 호출의 목적을 위해 열거 값 클래스를 템플릿 수 있다는 고정하는 방법이?

답변

1

문제는 간단하다 :

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

RoleBase을 연장하지 않습니다 역할의 당신의 재정.

를 제거하거나 변경 다음 중 하나를

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

헥타르! 그렇다면 컴파일러가 잘못된 템플릿 전문화에 대해 경고하지 않는 이유는 무엇입니까? 어떤 사람들은이 역할들이 컴파일러에 의해 어떻게 해석되는지를 추측한다. – ShS

+1

템플릿은 템플릿을 사용할 때 인스턴스화되며 템플릿이 인스턴스화되면 [memoized] (https://en.wikipedia.org/wiki/Memoization)입니다. –

+0

템플릿을 전문화하면 컴파일러는 자체적으로 새 정의를 만드는 대신 정의를 사용합니다. –

관련 문제