(je crois bien que cette fois-ci mon deuxième message d'hier soir s'est
vraiment perdu corps et biens)
J'ai une nouvelle erreur de compilation qui me pose vraiment problème
(auparavant, avec les anciens gcc, le code compilait et s'exécutait
correctement).
J'ai un patron de classe template A (qui implémente une interface
[classe 100% abstraite]), et ce patron définit et implémente quelques
méthodes virtuelles, déclare des méthodes virtuelles pures, et définit
des données membres (protected).
J'ai un deuxième patron de classe B qui dérive de manière publique de A,
et qui est "instanciable" : il implémente toutes les méthodes
nécessaires, et en surcharge d'autres.
Mon problème est que dès que dans une méthode définie au niveau de B
j'utilise une des données membres déclarées dans A, le compilateur
affirme que cette variable n'est pas déclarée (j'ai placé en fin de
courriel les détails)
Est-ce qu'il y a une spécificité de l'héritage de template qui puisse
expliquer cette erreur ?
Question annexe : comme cela doit provenir d'une méconnaissance de ma
part des templates, j'aimerais bien en lire les spécifications. J'en
étais resté à une norme C++ qui n'était pas accessible publiquement (en
tout cas pas sans payer), est-ce toujours le cas ? Je sais aussi que
Herb Sutter & co ont dû écrire un livre sur le sujet mais cela fait
beaucoup à lire pour des besoins ponctuels !
Merci d'avance à tous les courageux amateurs de C++ pour toute
indication sur cette erreur de compil',
Olivier.
Patron A :
template <class Key>
class ResourceManager : public Ceylan::TextDisplayable
qui déclare par exemple la méthode virtuelle pure :
virtual const Resource * get( const Key & key ) throw() = 0 ;
In member function `virtual const Ceylan::Resource*
Ceylan::BasicResourceManager<Key>::get(const Key&)':
[..]/CeylanBasicResourceManager.h:268: error: `_cacheHits' undeclared
(first use this function)
(la ligne 268 c'est '_cacheHits++ ;')
Je peux fournir le code complet si cela peut aider.
Merci !
typename std::map<Key, const Resource *>::const_iterator it = _entries.find( key ) ; if ( it != _entries.end() ) { _cacheHits++ ;
this->_cacheHits++ ; ou Ceylan::ResourceManager<Key>::_cacheHits++ ;
sinon, le compilateur ne cherchera pas les noms dans la classe de base (qui ne contient pas forcement un membre _cacheHits pour tous les "Key" car un petit malin pourrait faire une spécialisation ...)
return (*it).second ; } else { _cacheMisses++ ;
dito
return 0 ; } }
Falk
Olivier Boudeville wrote:
template <class Key>
class ResourceManager : public Ceylan::TextDisplayable
qui déclare par exemple la méthode virtuelle pure :
virtual const Resource * get( const Key & key ) throw() = 0 ;
typename std::map<Key, const Resource *>::const_iterator it =
_entries.find( key ) ;
if ( it != _entries.end() )
{
_cacheHits++ ;
this->_cacheHits++ ;
ou
Ceylan::ResourceManager<Key>::_cacheHits++ ;
sinon, le compilateur ne cherchera pas les noms dans la classe de base
(qui ne contient pas forcement un membre _cacheHits pour tous les "Key"
car un petit malin pourrait faire une spécialisation ...)
typename std::map<Key, const Resource *>::const_iterator it = _entries.find( key ) ; if ( it != _entries.end() ) { _cacheHits++ ;
this->_cacheHits++ ; ou Ceylan::ResourceManager<Key>::_cacheHits++ ;
sinon, le compilateur ne cherchera pas les noms dans la classe de base (qui ne contient pas forcement un membre _cacheHits pour tous les "Key" car un petit malin pourrait faire une spécialisation ...)
return (*it).second ; } else { _cacheMisses++ ;
dito
return 0 ; } }
Falk
Olivier Boudeville
Je n'avais pas pensé au coup de la spécialisation, merci énormément Falk !
Je crois que c'était la dernière erreur qui me bloquait, merci au newsgroup de m'avoir donné un coup de main (et désolé pour les posts multiples).
Olivier.
Falk Tannhäuser wrote:
Olivier Boudeville wrote:
template <class Key> class ResourceManager : public Ceylan::TextDisplayable
qui déclare par exemple la méthode virtuelle pure : virtual const Resource * get( const Key & key ) throw() = 0 ;
this->_cacheHits++ ; ou Ceylan::ResourceManager<Key>::_cacheHits++ ;
sinon, le compilateur ne cherchera pas les noms dans la classe de base (qui ne contient pas forcement un membre _cacheHits pour tous les "Key" car un petit malin pourrait faire une spécialisation ...)
return (*it).second ; } else { _cacheMisses++ ;
dito
return 0 ; } }
Falk
Je n'avais pas pensé au coup de la spécialisation, merci énormément Falk !
Je crois que c'était la dernière erreur qui me bloquait, merci au
newsgroup de m'avoir donné un coup de main (et désolé pour les posts
multiples).
Olivier.
Falk Tannhäuser wrote:
Olivier Boudeville wrote:
template <class Key>
class ResourceManager : public Ceylan::TextDisplayable
qui déclare par exemple la méthode virtuelle pure :
virtual const Resource * get( const Key & key ) throw() = 0 ;
this->_cacheHits++ ;
ou
Ceylan::ResourceManager<Key>::_cacheHits++ ;
sinon, le compilateur ne cherchera pas les noms dans la classe de base
(qui ne contient pas forcement un membre _cacheHits pour tous les "Key"
car un petit malin pourrait faire une spécialisation ...)
this->_cacheHits++ ; ou Ceylan::ResourceManager<Key>::_cacheHits++ ;
sinon, le compilateur ne cherchera pas les noms dans la classe de base (qui ne contient pas forcement un membre _cacheHits pour tous les "Key" car un petit malin pourrait faire une spécialisation ...)