Sanırım tüm cevaplar, typename
anahtar kelimenin iki farklı durumda kullanıldığından bahsetti :
a) Bir şablon türü parametresi bildirirken. Örneğin
template<class T> class MyClass{}; // these two cases are
template<typename T> class MyNewClass{}; // exactly the same.
Aralarında hiçbir fark olmayan ve TAM OLARAK aynıdır.
b) Bir şablon için iç içe geçmiş bağımlı bir tür adı kullanmadan önce .
template<class T>
void foo(const T & param)
{
typename T::NestedType * value; // we should use typename here
}
Kullanılmaması typename
ayrıştırma / derleme hatalarına yol açar.
İkinci duruma eklemek istediğim, Scot Meyers kitabının Etkili C ++ ' da belirtildiği gibi , iç içe geçmiş bir bağımlı tür adındantypename
önce kullanmanın bir istisnası olmasıdır . İstisna kullanırsanız olmasıdır iç içe bağımlı tür adı bir şekilde ya temel sınıf veya içinde üye başlatma listesinde , kullanmak olmamalıdır orada:typename
template<class T>
class D : public B<T>::NestedType // No need for typename here
{
public:
D(std::string str) : B<T>::NestedType(str) // No need for typename here
{
typename B<T>::AnotherNestedType * x; // typename is needed here
}
}
Not: Kullanımı typename
ikinci durum için (yani iç içe bağımlı tip adından önce) 20 C ++ beri gerekli değildir.