Tengo el siguiente código:
template <typename TC>
class C
{
struct S
{
template <typename TS>
void fun() const
{}
};
void f(const S& s)
{
s.fun<int>();
}
};
// Dummy main function
int main()
{
return 0;
}
Al compilar esto con gcc 9.2 y clang (9.0), obtengo un error de compilación debido a que templatese requiere la palabra clave para invocar fun. Clang muestra:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
No entiendo por qué el compilador piensa que funes un nombre dependiente en el contexto de f, ya fque no es una plantilla en sí. Si cambio Ca ser una clase regular en lugar de una plantilla, el error desaparece; Sin embargo, no veo por qué debería haber un error en primer lugar, ya que Sni fdependen ni dependen de él TC.
Por extraño que parezca, MSVC 19.22 compila esto muy bien.
Nota
Antes de votar para cerrar como engañado de ¿Dónde y por qué tengo que poner las palabras clave "plantilla" y "nombre de tipo"? tenga en cuenta que este es un caso especial en el que incluso si de Shecho es un nombre dependiente, en el contexto de feste no sería dependiente si no fuera por el hecho de que son miembros de la instanciación actual.