typename
และclass
สามารถใช้แทนกันได้ในกรณีพื้นฐานของการระบุแม่แบบ:
template<class T>
class Foo
{
};
และ
template<typename T>
class Foo
{
};
เทียบเท่า
ต้องบอกว่ามีเฉพาะกรณีที่มีความแตกต่างระหว่างและtypename
class
คนแรกคือในกรณีของประเภทขึ้นอยู่กับ 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> เป็นคลาสที่แน่นอนที่สุด