Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » C & Cie. » [C++] Template et héritage

Francesco
Modérateur
Citer Windows XP Firefox 2 - Posté le 07/05/2007 à 17:05
Bonjour à tous

Voilà, j'ai quelques petits soucis, et la je commence vraiment à craquer !
Voici le bout de code incriminé :


#include <list>
using namespace std;

template<class Item>
class TASK_API ExtendedList : public std::list<Item*>
{
public:
class iterator : public std::list<Item*>::iterator
{
public:
inline iterator() : list<Item*>::iterator(){}
inline iterator(const list<Item*>::iterator& it) : list<Item*>::iterator(it){}

inline Item* operator->()
{
return *((list<Item*>::iterator)(*this));
}
friend class ExtendedList<Item>;
};
};



Le souci est le 2ème constructeur : inline iterator(const list<Item*>::iterator& it) : list<Item*>::iterator(it){}.
Ce code, compiler avec GCC, me fournit l'erreur suivante :
[ocde]
extendedlist.h:26: error: expected unqualified-id before '&' token
extendedlist.h:26: error: expected `,' or `...' before '&' token
extendedlist.h:26: error: ISO C++ forbids declaration of `parameter' with no type
[/code]

alors que ce même code compile très bien sous Visual Studio. On dirait que GCC n'arrive pas à reconnaitre list<Item*>::iterator comme étant un type, car il suffit que je mette iterator ou juste list<Item*> pour que l'erreur disparaisse !
Aurais-je manqué quelques choses lors de la résolution de portée (question)

Merci de votre aide !


Edité par Francesco ( 07/05/2007 18:32:02 )
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
zuzuf
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 07/05/2007 à 19:15
quand je fais un copier/coller j'ai un espace entre & et it, est-ce que ça ne viendrait pas de là?

iterator& it
Linux a un noyau, windows un pepin
Francesco
Modérateur
RemonterCiter Windows XP Firefox 2 - Posté le 07/05/2007 à 21:07
non, du tout.
"iterator& it" et "iterator &it" sont strictement équivalent en C++ (même chose pour *). Le problème est ailleur...
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
zuzuf
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 08/05/2007 à 00:13
je crois que je sais d'où ça vient GCC ne comprend pas qu'il s'agit d'un type parce que celui-ci n'est pas encore construit, il faut donc ajouter le mot clef typename devant list<Item*>::iterator. J'avais eu ce problème dans mon projet actuel...ça m'avait donné du fil à retordre.
Linux a un noyau, windows un pepin
Francesco
Modérateur
RemonterCiter Windows XP Firefox 2 - Posté le 08/05/2007 à 02:54
Merci beaucoup, cela fonctione parfaitement ! J'avoue que je ne connaissais pas l'utilité de typename pour ça ! Pour moi, il ne pouvait s'utiliser que dans les déclarations de template !

Faudra que je me renseigne, mais la dodo !

Encore merci Zuzuf !
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2008 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,080 s - Crédits - Stats
1 connecté