Problème de declaration de sous-class

Problème de declaration de sous-class - C++ - Programmation

Marsh Posté le 08-10-2004 à 03:50:38    

Bonjour à tous,
j’ai un problème dont je ne trouve pas de solution ;
 
Prenons un exemple :

Code :
  1. template <class TypeA, class TypeB, class TypeC>
  2. class Stock : public Index<TypeA, Item<Elem<TypeA, TypeB> > >{
  3. template<class Type>
  4. class Item {
  5.  public:
  6.  friend class Stock<TypeA, TypeB, TypeC>;
  7.  Type E;
  8.  Item<Elem<TypeA, TypeB> > * down;
  9.  Item<Elem<TypeA, TypeB> > * up;
  10.  Item(Type &T, Item<Elem<TypeA, TypeB> > * _down=NULL, Item<Elem<TypeA, TypeB> > * _up=NULL): E(T), down(_down), up(_up) { }
  11.  Item(): E(), down(NULL), up(NULL) {}
  12.  Type& Info(){ return E; }
  13.  };
  14. bool var_membre ;
  15. public :
  16. bool fctMembre() ;
  17. } ;


 
Ceci ne compile évidement pas ; au moment de la déclaration de la class Stock, la class Item n’a pas encore été définie or celle-ci est utilisée pour etre passé en argument de template à la class (index) dont herite Stock.
( => « 'Item' : undeclared identifier »)
 
donc je déclare Item comme-ce ci en début de code :  
 

Code :
  1. template <class TypeA, class TypeB, class TypeC>
  2. class Stock;
  3. template < class TypeA, class TypeB, class TypeC, class Type>
  4. class Stock<TypeA, TypeB, TypeC>::Item<Type>;


 
Mais mon compilo m’envoit :
=>” 'Item' : is not a member of 'Stock<TypeA, TypeB, TypeC>'”
 
Et là je comprend pas ; peut être ai-je mal déclaré les classes mais me semble avoir un peu tout tester pour être sur que ce n’était pas une faute de syntaxe (le « template < class TypeA, class TypeB, class TypeC, class Type> » est un peu bizarre mais je sais pas comment faire autrement ? ) .
 
Donc voilà si quelqu’un à une super solution à me proposer, ça m’arrangerai bien.
J’espère avoir été claire.
Merci d’avance.
 :bounce:

Reply

Marsh Posté le 08-10-2004 à 03:50:38   

Reply

Marsh Posté le 08-10-2004 à 08:38:35    

je comprends pas trop ce que tu veux faire mais tu te mords la queue : tu veux faire une classe qui hérite d'une de ses classes imbriquées ...
 
Moi je te conseille tout simplement de définir Item dans namespace anonyme. Et d'utiliser des typedef pour la lisibilité.

Reply

Marsh Posté le 08-10-2004 à 09:17:47    

Pareil : pour cacher du code, ici les namespaces sont carrément plus adaptés que les classes imbriquées.  
 
Ceci-dit, c'est un vrai merdier ton truc. A ce niveau là, je commencerai à introduire des classes d'interfaces (toutes fonctions virtuelle pures quoi), ne serait-ce que pour simplifier le biniou.  
 
En n'utilisant que des pointeurs sur Item, et en faisant dériver Item d'une classe "abstraite", tu devrais pouvoir te dépatouiller, je pense, quitte à rendre Item dépendant de sa classe Elem.
 
 

Code :
  1. typedef ItemInterface<TypeA, TypeB> ItemAB;
  2. template <IteamAB, class TypeC>
  3. class Stock : public Index<IteamAB::TypeA, ItemAB >{ 
  4.     template<class Type>
  5.      class Item : ItemAB {


Reply

Marsh Posté le 08-10-2004 à 09:19:07    

ah non, commence pas à saucer les zolis template avec du virtuel :o

Reply

Marsh Posté le 08-10-2004 à 09:35:28    

Taz a écrit :

ah non, commence pas à saucer les zolis template avec du virtuel :o


Si c'est cool. Il parrait que c'est la dernière mode à miami. En plus, ils utilisent des boost::lambdas pour faire hype comme les programmeurs python de L.A.

Reply

Marsh Posté le 08-10-2004 à 12:18:56    

Merci pour vos conseils !
J’avoue que c’est un peu bordelique mais c’est le seule endroit du code  :ange:  
En fait le but est d’indexer les items d’une b-queue doublement liée avec un AVL, ce qui marchait très bien jusqu'à ce que j’ajoute une classe Index entre ma b-queue (Stock) et mon AVL dont herite maintenant Index, le but étant de pouvoir éventuellement rendre index statique pour avoir un indexer unique pour un ensemble de b-queue.
 
En fait j’avais déjà tenter de définir Item dans namespace anonyme mais comme j’utilise

Code :
  1. friend class Stock<TypeA, TypeB, TypeC>;

ou encore

Code :
  1. Item<Elem<TypeA, TypeB> >

il faut donc que je redéfinisse le template d’item :  

Code :
  1. template < class TypeA, class TypeB, class TypeC, class Type>


Et donc corrige toutes les instanciations d’Item, ce que je voulais justement éviter par ce que y’en a un paquet, que ça rendra le code encore moins lisible et que conceptuellement cette définition d’item appartient à la stock (j’ai d’autres définitions d’Item dans d’autres namespaces pour le même prog) mais bon si c la seule solution….je me résignerai.  :(


Message édité par peak le 08-10-2004 à 12:20:11
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed