Ha pasado un tiempo desde que GCC me atrapó con esta, pero simplemente sucedió hoy. Pero nunca he entendido por qué GCC requiere typedef typename dentro de las plantillas, mientras que VS y creo que ICC no lo hace. ¿Es typedef typename thing un "error" o un estándar de restricción excesiva, o algo que queda en manos de los escritores del compilador?¿Por qué necesito usar typedef typename en g ++ pero no VS?
Para aquellos que no saben lo que quiero decir aquí es una muestra:
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();
}
El código anterior se compila en VS (y probablemente en CPI), pero falla en GCC, ya que quiere de esta manera:
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 iter = container.find(key);
return iter!=container.end();
}
Nota: Esta no es una función real que estoy usando, pero sólo algo tonto que demuestra el problema.
La razón por la que se necesita en g ++, es porque g ++ es más compatible con el estándar. VS fue un poco flojo en esta parte del análisis de templacionización (que ha llevado a otros problemas en plantillas más complejas). –
Sí, pero ¿por qué el friggin estándar hace esto? ¡He tratado un código idéntico! –