Eu tenho o seguinte 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;
}
Ao compilar isso com o gcc 9.2 e o clang (9.0), estou recebendo um erro de compilação devido à template
exigência da palavra - chave para a chamada fun
. Clang mostra:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Não entendo por que o compilador pensa que fun
é um nome dependente no contexto de f
, já que f
não é um modelo em si. Se eu mudar C
para ser uma classe regular em vez de um modelo, o erro desaparece; no entanto, não vejo por que deveria haver um erro em primeiro lugar, pois S
nem f
dependemos disso TC
.
Curiosamente, o MSVC 19.22 compila isso muito bem.
Nota
Antes de votar para fechar como idiota de Onde e por que tenho que colocar as palavras-chave "modelo" e "nome do tipo"? considere que este é um caso especial em que, mesmo que S
seja realmente um nome dependente, no contexto f
dele não seria dependente se não fosse pelo fato de serem membros da instanciação atual.