Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
'type-name': l'uso del nome del modello dipendente deve essere preceduto da 'template'
'type-name': l'uso del nome del tipo dipendente deve essere preceduto da 'typename'
Osservazioni:
In /permissive- modalità, il compilatore richiede che la template parola chiave preceda un nome di modello quando si tratta di un oggetto dipendente nested-name-specifier. Regole simili per i tipi qualificati da typename.
Il comportamento del compilatore è cambiato a partire da Visual Studio 2017 versione 15.8 in /permissive- modalità. Il compilatore richiede che la template parola chiave o typename preceda un nome di modello o di tipo quando si tratta di un oggetto dipendente nested-name-specifier. Per altre informazioni, vedere Risoluzione dei nomi per tipi dipendenti e modelli e risoluzione dei nomi.
Esempi
Il codice seguente in /permissive- modalità genera ora 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
}
};
Per correggere l'errore, aggiungere la parola chiave template all'istruzione Base<T>::example<int>(); , come illustrato nell'esempio seguente:
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 in /std:c++20 o versione successiva, i corpi dei modelli di funzione con istruzioni hanno if constexpr controlli aggiuntivi correlati all'analisi abilitati. Ad esempio, in Visual Studio 2017 il codice seguente produce C7510 solo se l'opzione /permissive- è impostata. In Visual Studio 2019 lo stesso codice genera errori anche quando l'opzione /permissive è impostata:
// 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";
}
Vedi anche
/permissive- (Conformità agli standard)
Risoluzione dei nomi per i tipi dipendenti
Modelli e risoluzione dei nomi
typename