J'ai le code suivant:
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;
}
Lors de la construction de ceci avec gcc 9.2 et clang (9.0), j'obtiens une erreur de compilation en raison du template
mot clé requis pour l'invocation fun
. Clang montre:
error: use 'template' keyword to treat 'fun' as a dependent template name
s.fun<int>();
^
template
Je ne comprends pas pourquoi le compilateur pense que fun
c'est un nom dépendant dans le contexte de f
, car ce f
n'est pas un modèle lui-même. Si je change C
pour être une classe régulière au lieu d'un modèle, l'erreur disparaît; cependant, je ne vois pas pourquoi il devrait y avoir une erreur en premier lieu puisque ni S
ni f
dépendre TC
.
Curieusement, MSVC 19.22 compile cela très bien.
Remarque
Avant de voter pour fermer en tant que dupe de Où et pourquoi dois-je mettre les mots-clés "modèle" et "nom de type"? veuillez considérer qu'il s'agit d'un cas spécial où même s'il S
s'agit bien d'un nom dépendant, dans le contexte de f
celui-ci ne serait pas dépendant sinon du fait qu'ils sont membres de l'instanciation actuelle.