2010-10-14 17 views
6

Bunu denedim, ancak uygun bir cevap alamadım. Herhangi bir C++ gurusu bana C++ 'ın neden OuterClass <T> :: typename anahtar kelimesiyle bildirilmesinin gerektiğini açıklayabilir mi?C++ typename ve iç sınıflar

Bir veri yapıları kursu için TA ve ben bu hatayı tüm zaman görüyoruz. Öğrencilerime, yazım türünün dönüş türünün önüne koyulması gerektiğini söylediklerini biliyorum, ancak bunun neden gerekli olduğunu açıklayamıyorum.

Teşekkürler.

+0

küçük bir kod örnek verebilir misiniz? –

cevap

6

Bu, şablonlardaki iki aşamalı ad arama nedeniyle. Derleyici Innerclass'ı gördüğünde, bu adın bir tür olup olmadığını bilmelidir (örneğin, OuterClass'ın bazı özelleştirilmesi için tip int'nin statik bir üyesi olabilir). Öyleyse, böyle söylemediğiniz sürece bir tür ismi DEĞİL. typename şablonlarda ve sadece şablon parametresine bağlı isimlerde kullanılmalıdır. HTH

örnek:

template <class T> 
class X 
{ 
    typedef T XXX; 
}; 
template<> 
class X<char> 
{ 
    static int XXX; 
}; 

template<class T> 
class Y 
{   
    // X<T>::XXX member; invalid XXX is not assumed to be a type! 
    typename X<T>::XXX member; 
    //we explicitly specify that XXX is a type; Later, upon instantiation, we will verify that 
}; 
4

OuterClass<T>::Innerclass

O Innerclass bir type temsil (Ben senin soruya görebileceğiniz gibi) bu yüzden OuterClass<T>::Innerclass

Örnek önce anahtar kelime typename eklemem gerekiyor çünkü: typenameT::iterator * iter; olmadan

template <class T> 
void foo() { 
    T::iterator * iter; 
    ... 
} 

T::iterator vearasında çarpım işlemi olarak yorumlanabilir

+2

Aslında nedeni, derleyicinin gereksinim duyduğu noktada bu bilgileri (şablonlar nedeniyle) belirleyememesidir. –

+1

@Let_Me_Be: Derleyici kodu nasıl yorumlayacağını bilir. Programcının * niyetini * belirleyemez. Ve sonra, VC++, bağımlı isimleri kontrol etmiyor ve şablon inküte edildiğinde işleri halletmiyor. VC++, uygun koşullarda aynı işlevden hem bir çarpma hem de işaretçi beyanı üretebilmelidir :) – UncleBens