Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Template et const_iterator

15 réponses
Avatar
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.

10 réponses

1 2
Avatar
Alain Ketterlin
Guillaume GOURDIN writes:

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.
Avatar
Alain Ketterlin
Alain Ketterlin writes:

Guillaume GOURDIN writes:

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.
Avatar
Michel Decima
Alain Ketterlin a écrit :
Guillaume GOURDIN writes:

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
Avatar
Guillaume GOURDIN
>> 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'...
Avatar
Fabien LE LEZ
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.
Avatar
pjb
Guillaume GOURDIN writes:

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__
Avatar
Fabien LE LEZ
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();
};
Avatar
Alain Ketterlin
Guillaume GOURDIN writes:

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.
Avatar
Mickaël Wolff
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
Avatar
Fabien LE LEZ
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.)
1 2