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