Saya pikir semua jawaban telah menyebutkan typename
kata kunci, digunakan dalam dua kasus berbeda:
a) Saat mendeklarasikan parameter tipe template. misalnya
template<class T> class MyClass{}; // these two cases are
template<typename T> class MyNewClass{}; // exactly the same.
Yang tidak ada perbedaan di antara mereka dan mereka PERSIS sama.
b) Sebelum menggunakan nama tipe dependen bersarang untuk templat.
template<class T>
void foo(const T & param)
{
typename T::NestedType * value; // we should use typename here
}
Yang tidak menggunakan typename
mengarah ke kesalahan parsing / kompilasi.
Apa yang ingin saya tambahkan ke kasus kedua, seperti yang disebutkan dalam buku Scot Meyers Effective C ++ , adalah bahwa ada pengecualian menggunakan typename
sebelum nama tipe bersarang tergantung . Pengecualian adalah bahwa jika Anda menggunakan nama tipe bersarang tergantung baik sebagai kelas dasar atau dalam daftar inisialisasi anggota , Anda tidak boleh menggunakannya di typename
sana:
template<class T>
class D : public B<T>::NestedType // No need for typename here
{
public:
D(std::string str) : B<T>::NestedType(str) // No need for typename here
{
typename B<T>::AnotherNestedType * x; // typename is needed here
}
}
Catatan: Menggunakan typename
untuk kasus kedua (yaitu sebelum nama tipe dependen bersarang) tidak diperlukan sejak C ++ 20.