typename
và class
có thể hoán đổi cho nhau trong trường hợp cơ bản chỉ định mẫu:
template<class T>
class Foo
{
};
và
template<typename T>
class Foo
{
};
là tương đương.
Đã nói rằng, có những trường hợp cụ thể có sự khác biệt giữa typename
và class
.
Đầu tiên là trong trường hợp của các loại phụ thuộc. typename
được sử dụng để khai báo khi bạn đang tham chiếu một kiểu lồng nhau phụ thuộc vào một tham số mẫu khác, chẳng hạn như typedef
trong ví dụ này:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Câu hỏi thứ hai bạn thực sự thể hiện trong câu hỏi của mình, mặc dù bạn có thể không nhận ra nó:
template < template < typename, typename > class Container, typename Type >
Khi chỉ định một mẫu mẫu , class
từ khóa PHẢI được sử dụng như trên - nó không thể thay thế cho nhau typename
trong trường hợp này (lưu ý: vì C ++ 17 cả hai từ khóa đều được cho phép trong trường hợp này) .
Bạn cũng phải sử dụng class
khi khởi tạo một cách rõ ràng một mẫu:
template class Foo<int>;
Tôi chắc chắn rằng có những trường hợp khác mà tôi đã bỏ lỡ, nhưng điểm mấu chốt là: hai từ khóa này không tương đương và đây là một số trường hợp phổ biến mà bạn cần sử dụng cái này hoặc cái kia.
template <typename T> typename Foo {};
, bởi vì Foo <T> chắc chắn là một lớp.