Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"type-name" (típusnév): a függő sablonnév használatát előtagként "sablon" előtaggal kell megadni
"type-name": a függő típusnév használatát "typename" előtaggal kell megadni
Megjegyzések
Módban /permissive- a fordító megköveteli, hogy a template kulcsszó megelőzze a sablon nevét, ha függőről nested-name-specifiervan szó. Hasonló szabályok vonatkoznak a következő által typenameminősített típusokra: .
A fordító működése megváltozott a Visual Studio 2017 15.8-os /permissive- verziójától kezdve a módban. A fordító megköveteli, hogy a template sablon vagy typename a kulcsszó megelőzze a sablont vagy a típusnevet, ha függőről nested-name-specifiervan szó. További információt a függő típusok és sablonok névfeloldásaés a névfeloldás című témakörben talál.
Példák
Az alábbi módban lévő /permissive- kód most a C7510-et emeli ki:
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
}
};
A hiba kijavításához adja hozzá a template kulcsszót az Base<T>::example<int>(); utasításhoz az alábbi példában látható módon:
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>();
}
};
A Visual Studio 2019-ben /std:c++20 az utasításokkal rendelkező if constexpr függvénysablon-testületeknél engedélyezve van a további elemzéssel kapcsolatos ellenőrzés. A Visual Studio 2017-ben például az alábbi kód csak akkor állítja elő a C7510-et, ha a /permissive- beállítás be van állítva. A Visual Studio 2019-ben ugyanez a kód akkor is hibákat okoz, ha a /permissive beállítás be van állítva:
// 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";
}
Lásd még
/permissive- (Szabványoknak való megfelelés)
Névfeloldás függő típusok esetén
Sablonok és névfeloldás
typename