typenameและclassสามารถใช้แทนกันได้ในกรณีพื้นฐานของการระบุแม่แบบ:
template<class T>
class Foo
{
};
และ
template<typename T>
class Foo
{
};
เทียบเท่า
ต้องบอกว่ามีเฉพาะกรณีที่มีความแตกต่างระหว่างและtypenameclass
คนแรกคือในกรณีของประเภทขึ้นอยู่กับ typenameใช้เพื่อประกาศเมื่อคุณอ้างอิงชนิดซ้อนที่ขึ้นอยู่กับพารามิเตอร์เทมเพลตอื่นเช่นtypedefในตัวอย่างนี้:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
คำถามที่สองที่คุณแสดงในคำถามของคุณถึงแม้ว่าคุณอาจไม่ได้ตระหนักถึง:
template < template < typename, typename > class Container, typename Type >
เมื่อระบุแม่แบบแม่แบบที่classคำหลักที่จะต้องนำมาใช้เป็นเหนือ - มันเป็นไม่ได้กันกับtypenameในกรณีนี้(หมายเหตุ: ตั้งแต่ C ++ 17 คำหลักที่ทั้งสองจะได้รับอนุญาตในกรณีนี้)
คุณต้องใช้classเมื่อสร้างอินสแตนซ์ของเท็มเพลตอย่างชัดเจน:
template class Foo<int>;
ฉันแน่ใจว่ามีอีกกรณีที่ฉันพลาดไป แต่สิ่งสำคัญคือ: คำหลักสองคำนี้ไม่เท่ากันและเป็นกรณีทั่วไปที่คุณต้องใช้อย่างใดอย่างหนึ่ง
template <typename T> typename Foo {};เพราะ Foo <T> เป็นคลาสที่แน่นอนที่สุด