typename
ve class
bir şablon belirtmenin temel durumunda değiştirilebilir:
template<class T>
class Foo
{
};
ve
template<typename T>
class Foo
{
};
eşdeğerdir.
Bunu söyledikten sonra, typename
ve arasındaki farkın olduğu belirli durumlar vardır.class
.
Birincisi bağımlı tipler söz konusudur. typename
, typedef
bu örnekte olduğu gibi başka bir şablon parametresine bağlı iç içe bir türe başvururken bildirmek için kullanılır :
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Sorunuzda gerçekten gösterdiğiniz ikincisi, bunun farkında olmasanız da:
template < template < typename, typename > class Container, typename Type >
Bir belirtirken şablon şablonu , class
anahtar kelime yukarıda gibi kullanılmalıdır - öyle değil ile değiştirilebilir typename
bu durumda (not: Her iki anahtar kelimeler bu durumda izin verilen C ++ 17 beri) .
class
Bir şablonu açıkça başlatırken de kullanmalısınız :
template class Foo<int>;
Kaçırdığım diğer durumlar olduğundan eminim, ancak sonuçta: bu iki anahtar kelime eşdeğer değildir ve bunlar, birini veya diğerini kullanmanız gereken bazı yaygın durumlardır.
template <typename T> typename Foo {};
, çünkü Foo <T> kesinlikle bir sınıftır.