Bonjour,
J'ai deux classes virtuelles pures :
- Accessor qui défini un accesseur pour des données qui défini void m_open(void) = 0;
- AccessorRW qui hérite de Accessor (virtual public) et qui défini un accesseur pour des données qui bloque l'écriture des autres accesseurs sur les données et qui doit utiliser m_open(void)
J'ai 2 classes qui héritent de Accessor (virtual public) et qui définissent void m_open(void).
- AccessorR : accèdent aux données en lecture seule
- AccessorW : accèdent aux données en écriture
Et je veux créer deux classes :
- AccessorRWR : hérite de AccessorRW et de AccessorR ;
- AccessorRWW : hérite de AccessorRW et de AccessorW ;
Toutes ces classes sont templates.
Or lorsque je veux utiliser des membres des classes parentes, je suis obligé de spécifier la classe :
.Accessor<T>::attribut; alors qu'avec l'héritage publique je devrait théoriquement pouvoir directement faire : attribut; (sinon le compilateur m'insulte car le membre ne serait pas déclaré) serait-ce dû au fait que toutes mes classes sont template ?
Ceci devient problématique lors de l'utilisation de m_open dans AccessorRW.
Déjà suis-je obligé de redéfinir m_open dans AccessorRWR s'il est déjà défini dans AccessorR ?
Dans le doute je l'ai quand même fait.
Mais lorsque je compile le compilateur m'insulte encore :
- si je met Accessor<T>::m_open() il dit qu'il ne trouve pas la référence de Accessor<T>::m_open().
- si je met m_open(), il me dit :
.error: there are no arguments to ‘m_open’ that depend on a template parameter, so a declaration of ‘m_open’ must be available
Voici le code incriminé :
Je récapitules donc mes questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template<class Type> //Rq : P est un typedef pour la mère : Accessor void AccessorRW<Type>::open(void) { P::m_parent.m_mutex.lock(); m_open(); P::isOpen = true; }
- est-il normal que je soit obligé de spécifier la classe mère contenant les attributs ( visibilité protected ) alors que j'hérite de ceux-ci ?
- dans le cas d'un héritage par diamant, si j'implémente dans une branche une méthode virtuelle pure, est-ce que je peux appeler cette méthode dans la seconde branche ?
- comment appeler m_open dans AccessorRW ?
EDIT : merci à gbdivers et à LittleWhite pour leur aide sur le chat.
Pour que ça fonctionne, il faut mettre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part this->methode();
Partager