Share via


Error del compilador C7510

"type-name": el uso de nombre de plantilla dependiente debe tener como prefijo "template"
"type-name": el uso de nombre de tipo dependiente debe tener como prefijo "typename"

En el modo /permissive-, el compilador requiere que la palabra clave template preceda a un nombre de plantilla si va después de un nested-name-specifier dependiente. Los tipos calificados por typename tienen reglas similares.

Comentarios

El comportamiento del compilador se modificó a partir de la versión 15.8 de Visual Studio 2017 en modo /permissive-. El compilador requiere que la palabra clave template o typename preceda a una plantilla o nombre de tipo si va después de un nested-name-specifier dependiente. Para más información, consulte Resolución de nombres para los tipos dependientes y Plantillas y resolución de nombres.

Ejemplos

El código siguiente en modo /permissive- ahora genera el error 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
    }
};

Para corregir el error, agregue la palabra clave template a la instrucción Base<T>::example<int>();, como se muestra en el ejemplo siguiente:

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>();
    }
};

En Visual Studio 2019 en /std:c++20 o versiones posteriores, los cuerpos de plantilla de función que tienen instrucciones tienen if constexpr habilitadas comprobaciones adicionales relacionadas con el análisis. Por ejemplo, en Visual Studio 2017, el código siguiente genera la advertencia C7510 solo si se establece la /permissive- opción . En Visual Studio 2019, el mismo código genera errores incluso cuando la opción /permissive está establecida:

// 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";
}

Consulte también

/permissive- (conformidad con los estándares)
Resolución de nombres para tipos dependientes
Plantillas y resolución de nombres
typename