Cela faisait un moment que GCC ne m'avait pas attrapé avec celui-ci, mais c'est arrivé aujourd'hui. Mais je n'ai jamais compris pourquoi GCC exige typedef typename dans les templates, alors que VS et ICC, je suppose, ne le font pas. Est-ce que le typedef typename est un "bug" ou une norme trop stricte, ou quelque chose qui est laissé à la discrétion des auteurs de compilateurs ?
Pour ceux qui ne savent pas ce que je veux dire, voici un échantillon :
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
std::map<KEY,VALUE>::const_iterator iter = container.find(key);
return iter!=container.end();
}
Le code ci-dessus compile dans VS (et probablement dans ICC), mais échoue dans GCC parce qu'il le veut comme ceci :
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename
iterator = container.find(key);
return iter!=container.end();
}
Note : Il ne s'agit pas d'une fonction réelle que j'utilise, mais juste d'une fonction idiote qui illustre le problème.