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.
Hinweise
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.
Das Compilerverhalten wurde ab Visual Studio 2017, Version 15.8, im /permissive- Modus geändert. Der Compiler erfordert, dass dem templatetypename 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 template das Schlüsselwort Base<T>::example<int>(); 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