Je suis en train de compiler un exemple de « Design Patterns » et je suis confronté au problème suivant:Puis-je créer le constructeur d'une classe dérivée constexpr si le constructeur de la classe de base n'est pas constexpr?
J'ai une classe de base MapSite:
class MapSite{
public:
MapSite();
virtual ~MapSite();
virtual void Enter() = 0;
};
et une salle de classe dérivée:
class Room : public MapSite final{
private:
unsigned int room_number;
public:
Room(unsigned int rn) : room_number(rn) {};
virtual void Enter() override;
};
d'une autre classe que je veux appeler la fonction
virtual std::unique_ptr<Room> MakeRoom(unsigned int n) {return make_unique<Room(n)>();}
Quand je fais si je reçois l'erreur suivante:
error: temporary of non-literal type ‘Room’ in a constant expression
virtual std::unique_ptr<Room> MakeRoom(unsigned int n) {return unique::make_unique<Room(n)>();}
donc je pensais que le problème peut être que le constructeur doit être constexpr
pour appeler le constructeur de la chambre d'une autre fonction, mais réglage du constructeur à :
constexpr Room(unsigned int rn) : room_number(rn) {};
génère cette erreur:
error: call to non-constexpr function ‘MapSite::MapSite()’
constexpr Room(unsigned int rn) : room_number(rn) {};
Ma question fondamentale est de savoir si je peux ma ke un constructeur de classe dérivé constexpr, même si le constructeur de la classe de base ne l'est pas. Ou peut-être s'il y a un bien meilleur concept pour résoudre ce problème.
PS: make_unique est un C++ 14 fonctionnalité que j'imité d'ici How to implement make_unique function in C++11? C++ 11, que je suis en compilant avec
Demandez-vous: qu'est-ce que c'est que ce code essaie même d'utiliser 'Room' dans une expression constante et pourquoi? – Barry