Compilerfehler C7510

"Typname": Bei Verwendung des Namens der abhängigen Vorlage muss das Präfix "template" vorangestellt werden.
'Typname': Die Verwendung des abhängigen Typnamens muss mit dem Präfix 'typname' versehen sein.

Im /permissive- -Modus erfordert der Compiler, dass das template Schlüsselwort einem Vorlagennamen vorangestellt wird, wenn es nach einem abhängigen nested-name-specifierfolgt. Ähnliche Regeln gelten für Typen, die durch qualifiziert werden typename.

Hinweise

Das Compilerverhalten hat sich ab Visual Studio 2017 Version 15.8 im /permissive- -Modus geändert. Der Compiler erfordert, dass das -Schlüsselwort oder typename das template -Schlüsselwort einer Vorlage oder einem Typnamen vorangestellt wird, wenn es nach einem abhängigen nested-name-specifierfolgt. Weitere Informationen finden Sie unter Namensauflösung für abhängige Typen und Vorlagen und Namensauflösung.

Beispiele

Der folgende Code im /permissive- -Modus löst jetzt C7510 aus:

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

Fügen Sie der Anweisung Base<T>::example<int>(); das Schlüsselwort template wie im folgenden Beispiel gezeigt hinzu, um den Fehler zu beheben:

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 unter /std:c++20 oder höher sind Vorlagenfunktionskörper if constexpr mit -Anweisungen mit zusätzlichen analysebezogenen Überprüfungen aktiviert. Der folgende Code löst in Visual Studio 2017 z. B. nur dann C7510 aus, wenn die Option /permissive- festgelegt ist. Der gleiche Code löst in Visual Studio 2019 Fehler aus, unabhängig davon, ob die /permissive-Option festgelegt ist:

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

Siehe auch

/permissive- (Standardskonformität)
Namensauflösung für abhängige Typen
Vorlagen und Namensauflösung
typename