Ho il codice seguente:
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;
}
Quando lo costruisco con gcc 9.2 e clang (9.0), ricevo un errore di compilazione a causa della templateparola chiave richiesta per invocare fun. Clang mostra:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Non capisco perché il compilatore pensi funsia un nome dipendente nel contesto di f, dal momento che fnon è un modello stesso. Se cambio Cad essere una classe normale anziché un modello, l'errore scompare; tuttavia, non vedo perché ci dovrebbe essere un errore in primo luogo poiché né Sné fdipende TC.
Stranamente, MSVC 19.22 lo compila bene.
Nota
Prima di votare per chiudere come duplicato di Dove e perché devo inserire le parole chiave "template" e "typename"? si prega di considerare che questo è un caso speciale in cui anche se Sè effettivamente un nome dipendente, nel contesto di fesso non sarebbe dipendente se non per il fatto che sono membri della presente istanza.