En this question, el autor de la pregunta tiene la siguiente función:¿Por qué no se necesita typename _not_ aquí en Visual Studio 2008/2010?
template<typename ITER>
bool nextPermutation(ITER start, ITER end)
{
return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category());
}
¿Por qué no es un typename
necesaria antes de la std::iterator_traits
? Pensé que era necesario para los tipos anidados de una plantilla, si la plantilla depende de un parámetro de plantilla en sí mismo. GCC parece apoyar mi idea, ya que no se compila bajo 4.3.4 y 4.5.1, exigiendo un typename
. Aún así, todavía se compila muy bien tanto en Visual Studio 2008 como en 2010.
¿Es esta otra extensión/error de Visual Studio que no conozco?
¿O es realmente posible deducir que iterator_category
es un tipo o una función porque es seguido por un par de paréntesis ()
? (Consulte los mensajes de @ DeadGM starting here.) Entonces, ¿esto es realmente un error en GCC?
Además de las opciones que enumera (constructor y función), 'iterator_category' podría ser una variable de miembro estática de un tipo que define operator(). – Sjoerd
@Sjoerd: O un puntero a la función. – sbi