Partager via


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