Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
"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