Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
'type-name': penggunaan nama templat dependen harus diawali dengan 'templat'
'type-name': penggunaan nama jenis dependen harus diawali dengan 'typename'
Keterangan
Dalam /permissive- mode, pengkompilasi memerlukan template kata kunci untuk mendahului nama templat ketika datang setelah dependen nested-name-specifier. Penahanan aturan serupa untuk jenis yang memenuhi syarat oleh typename.
Perilaku pengkompilasi telah berubah mulai dari Visual Studio 2017 versi 15.8 dalam /permissive- mode. Pengkompilasi memerlukan template kata kunci atau typename untuk mendahului templat atau nama jenis ketika datang setelah dependen nested-name-specifier. Untuk informasi selengkapnya, lihat Resolusi nama untuk jenis dependen dan Templat dan resolusi nama.
Contoh
Kode berikut dalam /permissive- mode sekarang meningkatkan 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
}
};
Untuk memperbaiki kesalahan, tambahkan kata kunci template ke pernyataan Base<T>::example<int>();, seperti yang ditunjukkan pada contoh berikut:
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>();
}
};
Di Visual Studio 2019 di bawah /std:c++20 atau yang lebih baru, badan templat fungsi yang memiliki if constexpr pernyataan memiliki pemeriksaan terkait penguraian tambahan diaktifkan. Misalnya, di Visual Studio 2017 kode berikut menghasilkan C7510 hanya jika /permissive- opsi diatur. Di Visual Studio 2019, kode yang sama menimbulkan kesalahan bahkan ketika opsi /permissive diatur:
// 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";
}
Lihat juga
/permissive- (Kesuaian standar)
Resolusi nama untuk jenis dependen
Templat dan resolusi nama
typename