Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
'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