Erro do compilador C7510

'type-name': o uso do nome de modelo dependente precisa ser prefixado com 'template'
'type-name': o uso do nome de tipo dependente precisa ser prefixado com 'typename'

No modo /permissive-, o compilador agora requer que a palavra-chave template preceda um nome de modelo quando ele vier depois de um dependente nested-name-specifier. Regras semelhantes se aplicam a tipos qualificados por typename.

Comentários

O comportamento do compilador foi alterado a partir do Visual Studio 2017 versão 15.8 no modo /permissive-. O compilador agora requer que a palavra-chave template ou typename preceda um nome de modelo ou tipo quando ele vier depois de um nested-name-specifier dependente. Para obter mais informações, consulte Resolução de nomes para tipos dependentes e Modelos e resolução de nomes.

Exemplos

Agora, no modo /permissive-, o seguinte código gera o 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 palavra-chave template à instrução Base<T>::example<int>();, 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 em /std:c++20 ou posterior, os corpos de modelo de função que têm instruções têm if constexpr verificações adicionais relacionadas à análise habilitadas. Por exemplo, no Visual Studio 2017, o seguinte código produz C7510 apenas se a opção /permissive- estiver definida. No Visual Studio 2019, o mesmo código gera erros mesmo quando a opção /permissive é 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";
}

Confira também

/permissive- (Conformidade com os padrões)
Resolução de nomes para tipos dependentes
Modelos e resolução de nomes
typename