Поделиться через


Ошибка компилятора C7510

"type-name": использование зависимого имени шаблона должно быть префиксировано с помощью шаблона "template".
"type-name": использование имени зависимого типа должно быть префиксировано с именем typename.

В /permissive- режиме компилятору необходимо template , чтобы ключевое слово предшествовало имени шаблона, когда оно происходит после зависимого nested-name-specifier. Аналогичные правила хранятся для типов, квалифицированных по typename.

Замечания

Поведение компилятора изменилось начиная с Visual Studio 2017 версии 15.8 в /permissive- режиме. Компилятору требуется template , чтобы ключевое слово или typename ключевое слово предшествовало имени шаблона или типа, когда оно происходит после зависимого nested-name-specifier. Дополнительные сведения см. в разделе "Разрешение имен" для зависимых типов и шаблонов и разрешения имен.

Примеры

Следующий код в /permissive- режиме теперь вызывает 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
    }
};

Чтобы исправить эту ошибку, добавьте ключевое слово template в инструкцию Base<T>::example<int>();, как показано в следующем примере.

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

В Visual Studio 2019 в /std:c++20 или более поздних версиях шаблоны функций, имеющие if constexpr инструкции, имеют дополнительные проверки, связанные с синтаксический анализ. Например, в Visual Studio 2017 следующий код создает C7510 только в том случае, если /permissive- установлен параметр. В Visual Studio 2019 тот же код вызывает ошибки независимо от того, задан ли параметр /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";
}

См. также

/permissive- (Соответствие стандартам)
Разрешение имен для зависимых типов
Шаблоны и разрешение имен
typename