typenamedan classdapat 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 typenamedan class.
Yang pertama adalah dalam kasus tipe dependen. typenamedigunakan untuk mendeklarasikan saat Anda mereferensikan tipe bersarang yang bergantung pada parameter templat lain, seperti typedefdalam 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 , classkata kunci HARUS digunakan seperti di atas - tidak dapat dipertukarkan dengan typenamekasus ini (catatan: karena C ++ 17 kedua kata kunci diizinkan dalam kasus ini) .
Anda juga harus menggunakan classketika 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.