Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
'type-naam': het gebruik van de naam van de afhankelijke sjabloon moet worden voorafgegaan door 'sjabloon'
'type-naam': het gebruik van de afhankelijke typenaam moet worden voorafgegaan door 'typenaam'
Opmerkingen
In /permissive- de modus vereist de compiler dat het template trefwoord voorafgaat aan een sjabloonnaam wanneer deze na een afhankelijke nested-name-specifiernaam komt. Vergelijkbare regels bevatten voor typen die zijn gekwalificeerd door typename.
Het compilergedrag is gewijzigd vanaf Visual Studio 2017 versie 15.8 onder /permissive- de modus. De compiler vereist dat het template of typename trefwoord voorafgaat aan een sjabloon of typenaam wanneer deze na een afhankelijke nested-name-specifiernaam komt. Zie Naamomzetting voor afhankelijke typen en sjablonen en naamomzetting voor meer informatie.
Voorbeelden
Met de volgende code onder /permissive- de modus wordt nu C7510 geactiveerd:
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
}
};
Als u de fout wilt oplossen, voegt u het template trefwoord toe aan de Base<T>::example<int>(); instructie, zoals wordt weergegeven in het volgende voorbeeld:
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 onder /std:c++20 of hoger zijn functiesjabloonteksten met if constexpr instructies extra parseringsgerelateerde controles ingeschakeld. In Visual Studio 2017 produceert de volgende code bijvoorbeeld alleen C7510 als de /permissive- optie is ingesteld. In Visual Studio 2019 veroorzaakt dezelfde code fouten, zelfs wanneer de /permissive optie is ingesteld:
// 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";
}
Zie ook
/permissive- (Standaardenconformance)
Naamomzetting voor afhankelijke typen
Sjablonen en naamomzetting
typename