Erreur du compilateur C7510
'type-name' : l’utilisation du nom de modèle dépendant doit être précédée de 'template'
'type-name' : l’utilisation du nom de type dépendant doit être précédée de 'typename'
En /permissive-
mode, le compilateur nécessite que l’mot clé template
précède un nom de modèle lorsqu’il s’agit d’une dépendancenested-name-specifier
. Règles similaires pour les types qualifiés par typename
.
Notes
Le comportement du compilateur a changé à partir de Visual Studio 2017 version 15.8 en /permissive-
mode. Le compilateur requiert l’ou typename
la template
mot clé de précéder un modèle ou un nom de type lorsqu’il s’agit d’un nom dépendantnested-name-specifier
. Pour plus d’informations, consultez Résolution de noms pour les types dépendants et les modèles et la résolution de noms.
Exemples
Le code suivant en /permissive-
mode déclenche maintenant l’erreur C7510 :
template<typename T> struct Base
{
template<class U> void example() {}
};
template<typename T>
struct X : Base<T>
{
void example()
{
Base<T>::example<int>(); // C7510: 'example': use of dependent
// template name must be prefixed with 'template'
// note: see reference to class template instantiation
// 'X<T>' being compiled
}
};
Pour corriger cette erreur, ajoutez le mot clé template
à l’instruction Base<T>::example<int>();
, comme illustré dans l’exemple suivant :
template<typename T> struct Base
{
template<class U> void example() {}
};
template<typename T>
struct X : Base<T>
{
void example()
{
// Add template keyword here:
Base<T>::template example<int>();
}
};
Dans Visual Studio 2019 sous /std:c++20
ou version ultérieure, les corps de modèle de fonction qui ont des instructions ont if constexpr
des case activée supplémentaires associées à l’analyse activées. Par exemple, dans Visual Studio 2017, le code suivant produit C7510 uniquement si l’option /permissive-
est définie. Dans Visual Studio 2019, le même code génère des erreurs, même si l’option /permissive
est définie :
// C7510.cpp
// compile using: cl /EHsc /W4 /permissive /std:c++latest C7510.cpp
#include <iostream>
template <typename T>
int f()
{
T::Type a; // error C7510: 'Type': use of dependent type name must be prefixed with 'typename'
// To avoid the error, add the 'typename' keyword. Use this declaration instead:
// typename T::Type a;
if constexpr (a.val)
{
return 1;
}
else
{
return 2;
}
}
struct X
{
using Type = X;
constexpr static int val = 1;
};
int main()
{
std::cout << f<X>() << "\n";
}
Voir aussi
/permissive-
(Conformité aux normes)
Résolution de noms pour les types dépendants
Modèles et résolution de noms
typename
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour