2016-11-05 11 views
0

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

#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

Если вы специализируетесь на шаблоне, компилятор будет использовать ваше определение вместо того, чтобы самостоятельно создавать новое определение. –

 Смежные вопросы

  • Нет связанных вопросов^_^