編譯程序錯誤 C7510
'type-name': 使用相依的範本名稱前面必須加上 'template'
'type-name':使用相依類型名稱的前面必須加上 'typename'
在 /permissive-
模式中,編譯程式要求 template
關鍵詞在相依 nested-name-specifier
之後的範本名稱前面。 針對 限定 typename
的類型保留類似的規則。
備註
從 Visual Studio 2017 15.8 /permissive-
版的模式開始,編譯程式行為已變更。 編譯程式在相依 nested-name-specifier
之後,需要 template
或 typename
關鍵詞在範本或類型名稱前面。 如需詳細資訊,請參閱 相依型 別的名稱解析和 範本和名稱解析。
範例
下列模式中的 /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";
}