typenameve classbir ş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, typenameve arasındaki farkın olduğu belirli durumlar vardır.class .
Birincisi bağımlı tipler söz konusudur. typename, typedefbu ö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 , classanahtar kelime yukarıda gibi kullanılmalıdır - öyle değil ile değiştirilebilir typenamebu durumda (not: Her iki anahtar kelimeler bu durumda izin verilen C ++ 17 beri) .
classBir ş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.