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-specifier
bir 'den sonra geldiğinde şablon adının önüne anahtar sözcüğünü gerektirirtemplate
. benzer kurallar tarafından typename
nitelenmiş 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-specifier
bir ş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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin