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.
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
>> 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'...
>> 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'...
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
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.
On Wed, 25 Jun 2008 14:19:39 +0200, Guillaume GOURDIN
<trash@hotmail.com>:
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.
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
Guillaume GOURDIN writes:
Bonjour à tous,
je ne comprends pas pourquoi le code suivant ne compile pas :
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.
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__
Guillaume GOURDIN <trash@hotmail.com> writes:
Bonjour à tous,
je ne comprends pas pourquoi le code suivant ne compile pas :
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.
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:
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.
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
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(); };
On Wed, 25 Jun 2008 14:31:34 +0200, pjb@informatimago.com (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();
};
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
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.
Guillaume GOURDIN <trash@hotmail.com> 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").
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
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;
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;
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;