2012-08-15 13 views
8

Bellek hizalamamı yazmaya çalışıyorum Aşağıdaki yapıyla çıktım (hala biraz ilerlemem gerekiyor, çünkü düzeltmem gerekiyor) GNU sürümü):template error: nontype ".. [T = T ile] bir tür adı değil"

template<typename T> 
class tsfo_vector { 
private: 
    sfo_type<T>::aptr32 m_data; 
    int     m_size; 
... 

ama sonra aşağıdaki hata iletisini alabilirsiniz:

#if defined(__GNUG__) 
template <typename T> 
struct sfo_type { 
    typedef T* restrict __attribute__((aligned(32))) aptr32; 
}; 

#elif defined(__INTEL_COMPILER) 
template <typename T> 
struct sfo_type { 
    typedef T* restrict __attribute__((aligned(32))) aptr32; 
}; 
#endif 

ve o zaman bu gibi kullanmayı deneyin

/Users/bravegag/code/fastcode_project/code/src/sfo_vector.h(43): error: nontype "sfo_type<T>::aptr32 [with T=T]" is not a type name 
sfo_type<T>::aptr32 m_data; 
^ 

Burada neyin yanlış olduğunu bilen var mı?

cevap

10

aptr32 böylece T bağlıdır: typename kullanımına ilişkin ayrıntılı açıklama için

template<typename T> 
    class tsfo_vector { 
    private: 
     typename sfo_type<T>::aptr32 m_data; 
     //^^^^^^^^ 

Where and why do I have to put the "template" and "typename" keywords?

+0

Güzel, teşekkürler! Aslında bununla şaşkınım ... nasıl bir veri üyesinin derlenecek bir yazım hatası işareti olması gerekiyor? biraz tuhaf bir şey. –

+0

@GiovanniAzua, bağlantılı olan 'typename' kullanımını kullanabileceğimden çok daha iyi açıklıyor. – hmjd

+0

@GiovanniAzua: Veri üyesi değil, türü "typedef" ile önekli. – celtschk