Błąd kompilatora C7510

"type-name": użycie nazwy szablonu zależnego musi być poprzedzone prefiksem "template"
"type-name": użycie nazwy typu zależnego musi być poprzedzone prefiksem "typename"

W /permissive- trybie kompilator wymaga template , aby słowo kluczowe poprzedzało nazwę szablonu, jeśli jest to zależne nested-name-specifier. Podobne reguły przechowują typy kwalifikowane przez typename.

Uwagi

Zachowanie kompilatora zmieniło się, począwszy od programu Visual Studio 2017 w wersji 15.8 w /permissive- trybie. Kompilator wymaga template , aby słowo kluczowe or typename poprzedzało szablon lub nazwę typu, jeśli jest to zależne nested-name-specifier. Aby uzyskać więcej informacji, zobacz Rozpoznawanie nazw dla typów zależnych i Szablony i rozpoznawanie nazw.

Przykłady

Poniższy kod w /permissive- trybie zgłasza teraz 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
    }
};

Aby naprawić błąd, dodaj template słowo kluczowe do instrukcji Base<T>::example<int>(); , jak pokazano w poniższym przykładzie:

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>();
    }
};

W programie Visual Studio 2019 w wersji /std:c++20 lub nowszej elementy szablonu funkcji, które zawierają instrukcje, mają if constexpr włączone dodatkowe kontrole związane z analizowaniem. Na przykład w programie Visual Studio 2017 poniższy kod generuje kod C7510 tylko wtedy, gdy opcja jest ustawiona /permissive- . W programie Visual Studio 2019 ten sam kod zgłasza błędy nawet wtedy, gdy opcja jest ustawiona /permissive :

// 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";
}

Zobacz też

/permissive- (Zgodność ze standardami)
Rozpoznawanie nazw dla typów zależnych
Szablony i rozpoznawanie nazw
typename