Aracılığıyla paylaş


Derleyici Hatası C7510

'type-name': Bağımlı şablon adının kullanımına 'template' ön eki eklenmelidir
'type-name': Bağımlı tür adının kullanımına 'typename' ön eki eklenmelidir

modunda/permissive-, derleyici, bağımlı nested-name-specifierbir 'den sonra geldiğinde şablon adının önüne anahtar sözcüğünü gerektirirtemplate. benzer kurallar tarafından typenamenitelenmiş türler için geçerlidir.

Açıklamalar

Visual Studio 2017 sürüm 15.8'den başlayarak mod altında /permissive- derleyici davranışı değişti. Derleyici, bağımlı nested-name-specifierbir şablondan sonra geldiğinde veya typename anahtar sözcüğünü bir şablonun veya tür adının önüne gelmesini gerektirirtemplate. Daha fazla bilgi için bkz . Bağımlı türler için ad çözümlemesi ve Şablonlar ve ad çözümleme.

Örnekler

Modun altındaki /permissive- aşağıdaki kod artık C7510'a yükseltir:

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

Hatayı düzeltmek için aşağıdaki örnekte gösterildiği gibi deyimine Base<T>::example<int>(); anahtar sözcüğünü ekleyintemplate:

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'da /std:c++20 , deyimleri olan if constexpr işlev şablonu gövdelerinde ayrıştırmayla ilgili ek denetimler etkindir. Örneğin, Visual Studio 2017'de aşağıdaki kod yalnızca seçenek ayarlandıysa /permissive- C7510 üretir. Visual Studio 2019'da seçenek ayarlandığında bile /permissive aynı kod hatalara neden oluyor:

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

Ayrıca bkz.

/permissive- (Standartlara uygunluk)
Bağımlı türler için ad çözümlemesi
Şablonlar ve ad çözümlemesi
typename