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 template
parola 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 fun
sia un nome dipendente nel contesto di f
, dal momento che f
non è un modello stesso. Se cambio C
ad essere una classe normale anziché un modello, l'errore scompare; tuttavia, non vedo perché ci dovrebbe essere un errore in primo luogo poiché né S
né f
dipende 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 f
esso non sarebbe dipendente se non per il fatto che sono membri della presente istanza.