Uso da palavra-chave typename com parâmetros de função do modelo
Em C ++, otypename
é necessária para que o compilador possa desambiguar entre tipos e valores aninhados em modelos. No entanto, há certas situações em que nenhuma ambiguidade é possível, como quando uma classe derivada herda de um tipo de classe aninhada.
template <class T>
class Derived : public T::type
{ };
Aqui otypename
palavra-chave não é necessária e, de fato, nem é permitida. Isso faz sentido, porque o contexto remove a ambiguidade. Aqui,T::type
deve se referir a um tipo, pois você obviamente não pode herdar de um valor.
Eu pensaria que o mesmo seria válido para os parâmetros do modelo de função.
template <class T>
void foo(const T::type& v)
{
}
Nesse caso, o contexto deixa claro queT::type
deve se referir a um tipo, pois um parâmetro de função não pode ser um valor No entanto, o compilador não aceita isso. Querconst typename T::type&
. Isso parece inconsistente. Por que a linguagem permite a suposição implícita de um tipo aninhado no contexto da herança, masnão no contexto de parâmetros de função? Em ambos os casos, não pode haver ambiguidade, por que a necessidade detypename
em um, mas não no outro?