Share via


編譯器錯誤 C7510

' type-name ': 使用相依的範本名稱前面必須加上 'template'
' type-name ':使用相依類型名稱的前面必須加上 'typename'

/permissive- 模式中,編譯器要求 template 關鍵字在相依 nested-name-specifier 之後的範本名稱前面。 針對 限定 typename 的類型保留類似的規則。

備註

從 Visual Studio 2017 15.8 /permissive- 版的模式開始,編譯器行為已變更。 編譯器在相依 nested-name-specifier 之後,需要 templatetypename 關鍵字在範本或類型名稱前面。 如需詳細資訊,請參閱 相依型 別的名稱解析和 範本和名稱解析

範例

下列模式中的 /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 中,只有在設定 選項時 /permissive- ,下列程式碼才會產生 C7510。 在 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