Compilerfehler C7510
'Typname': Die Verwendung des abhängigen Vorlagennamens muss mit dem Präfix "template" versehen werden.
'Typname': Die Verwendung des abhängigen Typnamens muss mit dem Präfix 'typename' versehen werden.
Im /permissive-
Modus erfordert der Compiler, dass dem template
Schlüsselwort ein Vorlagenname vorangestellt wird, wenn es nach einem abhängigen nested-name-specifier
. Ähnliche Regeln halten für Typen, die von typename
.
Hinweise
Das Compilerverhalten wurde ab Visual Studio 2017, Version 15.8, im /permissive-
Modus geändert. Der Compiler erfordert, dass dem template
typename
Oder Schlüsselwort eine Vorlage oder ein Typname vorangestellt wird, wenn es nach einem abhängigen nested-name-specifier
. Weitere Informationen finden Sie unter Namensauflösung für abhängige Typen und Vorlagen und namensauflösung.
Beispiele
Der folgende Code im /permissive-
Modus löst jetzt C7510 aus:
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
}
};
Fügen Sie der Anweisung Base<T>::example<int>();
das Schlüsselwort template
wie im folgenden Beispiel gezeigt hinzu, um den Fehler zu beheben:
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>();
}
};
In Visual Studio 2019 unter /std:c++20
oder höher sind Funktionsvorlagentexte if constexpr
mit zusätzlichen Analyseüberprüfungen aktiviert. In Visual Studio 2017 erzeugt der folgende Code beispielsweise nur dann C7510, wenn die /permissive-
Option festgelegt ist. Der gleiche Code löst in Visual Studio 2019 Fehler aus, unabhängig davon, ob die /permissive
-Option festgelegt ist:
// 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";
}
Siehe auch
/permissive-
(Standardskonformität)
Namensauflösung für abhängige Typen
Vorlagen und Namensauflösung
typename