Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
'type-name': o uso do nome do modelo dependente deve ser precedido de 'template'
«Type-name»: a utilização do nome do tipo dependente deve ser precedida de «typename»
Observações
No /permissive- modo, o compilador requer que a template palavra-chave preceda um nome de modelo quando vem depois de um dependente nested-name-specifier. Regras semelhantes são válidas para tipos qualificados pela typename.
O comportamento do compilador foi alterado a partir do Visual Studio 2017 versão 15.8 no /permissive- modo. O compilador requer que a template palavra-chave or typename preceda um modelo ou nome de tipo quando vem depois de um dependente nested-name-specifier. Para obter mais informações, consulte Resolução de nomes para tipos dependentes e Modelos e resolução de nomes.
Examples
O seguinte código no /permissive- modo agora gera 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
}
};
Para corrigir o erro, adicione a template palavra-chave à Base<T>::example<int>(); instrução, conforme mostrado no exemplo a seguir:
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>();
}
};
No Visual Studio 2019 sob /std:c++20 ou posterior, os corpos de modelo de função que têm if constexpr instruções têm verificações adicionais relacionadas à análise habilitadas. Por exemplo, no Visual Studio 2017, o código a seguir produz C7510 somente se a /permissive- opção estiver definida. No Visual Studio 2019, o mesmo código gera erros mesmo quando a /permissive opção está definida:
// 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";
}
Consulte também
/permissive- (Conformidade com as normas)
Resolução de nomes para tipos dependentes
Modelos e resolução de nomes
typename