Sdílet prostřednictvím


Chyba kompilátoru C7510

'type-name': Použití závislého názvu šablony musí mít předponu "template"
'type-name': Použití závislého názvu typu musí mít předponu typename.

V /permissive- režimu kompilátor vyžaduje template , aby klíčové slovo předchází názvu šablony, pokud přichází po závislém nested-name-specifier. Podobná pravidla se uchovávají pro typy kvalifikované podle typename.

Poznámky

Chování kompilátoru se změnilo od sady Visual Studio 2017 verze 15.8 v /permissive- režimu. Kompilátor vyžaduje templatetypename , aby před šablonou nebo názvem typu předchází klíčové slovo, pokud následuje po závislém nested-name-specifierobjektu . Další informace najdete v tématu Překlad názvů pro závislé typy a šablony a překlad názvů.

Příklady

Následující kód v /permissive- režimu teď vyvolává 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
    }
};

Pokud chcete chybu opravit, přidejte template do Base<T>::example<int>(); příkazu klíčové slovo, jak je znázorněno v následujícím příkladu:

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

V sadě Visual Studio 2019 v rámci /std:c++20 nebo novějších verzích šablon funkcí, které obsahují if constexpr příkazy, mají povolené další kontroly související s parsováním. Například v sadě Visual Studio 2017 následující kód vytvoří C7510 pouze v případě, že /permissive- je tato možnost nastavená. V sadě Visual Studio 2019 stejný kód vyvolává chyby i v případě, /permissive že je tato možnost nastavená:

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

Viz také

/permissive- (Shoda se standardy)
Překlad názvů pro závislé typy
Šablony a překlad názvů
typename