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 templatemot 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 func'est un nom dépendant dans le contexte de f, car ce fn'est pas un modèle lui-même. Si je change Cpour ê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 Sni fdé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 Ss'agit bien d'un nom dépendant, dans le contexte de fcelui-ci ne serait pas dépendant sinon du fait qu'ils sont membres de l'instanciation actuelle.