Template et const_iterator

Le
Guillaume GOURDIN
Bonjour à tous,

je ne comprends pas pourquoi le code suivant ne compile pas :

template <class T>
bool Func_T(const vector<T> & sequence1, const vector<T> & sequence2)
{
vector<T>::const_iterator it1, it2;

// bla bla
}

int main(int argc, char ** argv)
{
vector<uint16_t> v1, v2;

Func_T(v1, v2);
}

Le message d'erreur de g++ est le suivant :

‘std::vector<T,std::allocator<_CharT> >::const_iterator’ is parsed as a
non-type, but instantiation yields a type
note: say ‘typename std::vector<T,std::allocator<_CharT>
>::const_iterator’ if a type is meant
In function ‘bool LiwCrcMatch_T(const std::vector<T,
std::allocator<_CharT> >&, const std::vector<T, std::allocator<_CharT>
>&) [with T = unsigned int]’:

Même en forcant le template est en appelant Func_T<uint16_t>(v1, v2),
j'ai la même erreur de compilatoin.

Quelqu'un aurait-il des éclaircissements?

Merci pour votre aide.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #7094941
Guillaume GOURDIN
template <class T>
bool Func_T(const vector<T> & sequence1, const vector<T> & sequence2)
{
vector<T>::const_iterator it1, it2;

// bla bla
}



Ecrire :

typename vector<T>::const_iterator it1;

résoudra peut-être le problème...

-- Alain.
Alain Ketterlin
Le #7094931
Alain Ketterlin
Guillaume GOURDIN
template <class T>
bool Func_T(const vector<T> & sequence1, const vector<T> & sequence2)
{
vector<T>::const_iterator it1, it2;

// bla bla
}





typename vector<T>::const_iterator it1;



Au fait, le compilateur t'explique même pourquoi c'est cela qu'il faut
faire (désolé, je n'ai vu son message qu'après coup).

-- Alain.
Michel Decima
Le #7094921
Alain Ketterlin a écrit :
Guillaume GOURDIN
template <class T>
bool Func_T(const vector<T> & sequence1, const vector<T> & sequence2)
{
vector<T>::const_iterator it1, it2;

// bla bla
}



Ecrire :

typename vector<T>::const_iterator it1;

résoudra peut-être le problème...



Et c'est bien ce que conseille le message du compilateur:

note: say ‘typename std::vector<T>::const_iterator’ if a type is meant
Guillaume GOURDIN
Le #7095031
>> Ecrire :

typename vector<T>::const_iterator it1;

résoudra peut-être le problème...



Et c'est bien ce que conseille le message du compilateur:

note: say ‘typename std::vector<T>::const_iterator’ if a type is meant



Oui, effectivement, en relisant le message du compilateur, j'ai fixé mon
problème, mais je ne suis pas sûr de comprendre pourquoi il faut
rajouter ce 'typename'...
Fabien LE LEZ
Le #7095021
On Wed, 25 Jun 2008 14:19:39 +0200, Guillaume GOURDIN

Oui, effectivement, en relisant le message du compilateur, j'ai fixé mon
problème, mais je ne suis pas sûr de comprendre pourquoi il faut
rajouter ce 'typename'...



Pour indiquer au compilateur que vector<T>::const_iterator est un
type.

En effet, le compilateur, au moment où il lit la définition de ta
classe, ne peut pas savoir s'il y a, ou non, après ce code, un code de
ce style :

class Bidule {};

template<> class vector<Bidule>
{
public:
void const_iterator();
};

En d'autres termes, si tu n'indiques pas que vector<T>::const_iterator
est un type, le compilo ne peut pas en être sûr.
pjb
Le #7095011
Guillaume GOURDIN
Bonjour à tous,

je ne comprends pas pourquoi le code suivant ne compile pas :

template <class T>
bool Func_T(const vector<T> & sequence1, const vector<T> & sequence2)
{
vector<T>::const_iterator it1, it2;

// bla bla
}

int main(int argc, char ** argv)
{
vector<uint16_t> v1, v2;

Func_T(v1, v2);
}

Le message d'erreur de g++ est le suivant :

‘std::vector<T,std::allocator<_CharT> >::const_iterator’ is parsed as
a non-type, but instantiation yields a type
note: say ‘typename std::vector<T,std::allocator<_CharT>
::const_iterator’ if a type is meant


In function ‘bool LiwCrcMatch_T(const std::vector<T,
std::allocator<_CharT> >&, const std::vector<T, std::allocator<_CharT>
&) [with T = unsigned int]’:



Même en forcant le template est en appelant Func_T<uint16_t>(v1, v2),
j'ai la même erreur de compilatoin.

Quelqu'un aurait-il des éclaircissements?



vector<T> n'est pas un type. En tout cas, pas tant qu'on n'a pas dit
ce que T est. Donc il faut informer le compilateur que vector<T>
_sera_ un type, avec typename:

typename vector<T>::const_iterator ...

--
__Pascal Bourguignon__
Fabien LE LEZ
Le #7095111
On Wed, 25 Jun 2008 14:31:34 +0200, (Pascal J.
Bourguignon):

vector<T> n'est pas un type.



Il me semble que si.

template <typename T> class vector { ... };
indique que si T est un type, vector<T> l'est aussi.

Ce qui n'est pas forcément un type, c'est vector<T>::const_iterator :

class Bidule {};
template<> class vector<Bidule>
{
public:
void const_iterator();
};
Alain Ketterlin
Le #7095101
Guillaume GOURDIN
typename vector<T>::const_iterator it1;







Oui, effectivement, en relisant le message du compilateur, j'ai fixé
mon problème, mais je ne suis pas sûr de comprendre pourquoi il faut
rajouter ce 'typename'...



Parce que vector<T>::iterator pourrait aussi bien représenter un
membre static (par exemple un attribut), auquel cas la syntaxe ne
serait pas correcte. Le problème est que le compilo doit décider entre
type et membre static un peu tôt dans le processus, et qu'il choisit
"membre static" par défaut (c'est ce que signifie "is parsed as a
non-type").

-- Alain.
Mickaël Wolff
Le #7098141
Guillaume GOURDIN a écrit :
Bonjour à tous,



Bonjour,

J'arrive après la guerre, mais je souhaiterai savoir pourquoi personne
n'a corrigé le main, alors que j'aurais d'emblée apporté la modification
suivant :

int main(int argc, char ** argv)
{
vector<uint16_t> v1, v2;



Func_T<uint16_t>(v1, v2) ;

}



C'est moi qui suis dans l'erreur ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Fabien LE LEZ
Le #8275911
On Wed, 25 Jun 2008 21:47:25 +0200, Mickaël Wolff

alors que j'aurais d'emblée apporté la modification
suivant :



Func_T<uint16_t>(v1, v2) ;



Pourquoi donc ?

(D'ailleurs, l'OP a bien précisé que ça ne changeait rien au
problème.)
Publicité
Poster une réponse
Anonyme