typename
dan class
dapat dipertukarkan dalam kasus dasar menentukan templat:
template<class T>
class Foo
{
};
dan
template<typename T>
class Foo
{
};
adalah setara.
Karena itu, ada kasus khusus di mana ada perbedaan antara typename
dan class
.
Yang pertama adalah dalam kasus tipe dependen. typename
digunakan untuk mendeklarasikan saat Anda mereferensikan tipe bersarang yang bergantung pada parameter templat lain, seperti typedef
dalam contoh ini:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Pertanyaan kedua yang sebenarnya Anda tunjukkan dalam pertanyaan Anda, meskipun Anda mungkin tidak menyadarinya:
template < template < typename, typename > class Container, typename Type >
Saat menentukan templat templat , class
kata kunci HARUS digunakan seperti di atas - tidak dapat dipertukarkan dengan typename
kasus ini (catatan: karena C ++ 17 kedua kata kunci diizinkan dalam kasus ini) .
Anda juga harus menggunakan class
ketika secara eksplisit membuat template:
template class Foo<int>;
Saya yakin ada beberapa kasus lain yang saya lewatkan, tetapi intinya adalah: dua kata kunci ini tidak setara, dan ini adalah beberapa kasus umum di mana Anda harus menggunakan satu atau yang lain.
template <typename T> typename Foo {};
, karena Foo <T> jelas merupakan kelas.