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 template
se 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 fun
es un nombre dependiente en el contexto de f
, ya f
que no es una plantilla en sí. Si cambio C
a 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 S
ni f
dependen 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 S
hecho es un nombre dependiente, en el contexto de f
este no sería dependiente si no fuera por el hecho de que son miembros de la instanciación actual.