Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
"type-name": användning av beroende mallnamn måste föregås av "mall"
"type-name": användning av beroende typnamn måste föregås av "typename"
Anmärkningar
I /permissive- läget kräver kompilatorn att nyckelordet template föregår ett mallnamn när det kommer efter en beroende nested-name-specifier. Liknande regler gäller för typer som kvalificerats av typename.
Kompilatorbeteendet har ändrats från och med Visual Studio 2017 version 15.8 under /permissive- läge. Kompilatorn kräver att nyckelordet template eller typename föregår en mall eller ett typnamn när det kommer efter en beroende nested-name-specifier. Mer information finns i Namnmatchning för beroende typer och Mallar och namnmatchning.
Examples
Följande kod under /permissive- läge genererar nu 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
}
};
Åtgärda felet genom att lägga till nyckelordet template i -instruktionen Base<T>::example<int>(); enligt följande exempel:
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>();
}
};
I Visual Studio 2019 under /std:c++20 eller senare har funktionsmallsorgan som har if constexpr instruktioner extra parsningsrelaterade kontroller aktiverade. I Visual Studio 2017 genererar till exempel följande kod endast C7510 om alternativet /permissive- har angetts. I Visual Studio 2019 genererar samma kod fel även när alternativet /permissive har angetts:
// 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";
}
Se även
/permissive- (Standardefterlevnad)
Namnmatchning för beroende typer
Mallar och namnmatchning
typename