2012-08-15 5 views
8

Provare a digitare l'allineamento della memoria Sono uscito con il seguente costrutto (che è ancora un po 'di lavoro in corso perché ho bisogno di correggere la versione GNU):errore di modello: nontype ".. [con T = T] non è un nome di tipo"

#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 

e poi cerco di usare in questo modo:

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

ma poi ricevo il seguente messaggio di errore:

/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; 
^ 

Qualcuno può consigliare cosa c'è che non va qui?

risposta

10

aptr32 dipende da T così:

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

Per ulteriori spiegazioni sull'uso di typename vedere Where and why do I have to put the "template" and "typename" keywords?

+0

Nizza, grazie! In realtà sono perplesso da questo ... come mai un membro dei dati deve avere un contrassegno typedef in primo piano per compilare? è un po 'strana. –

+0

@GiovanniAzua, la risposta collegata spiega l'uso di 'typename' molto meglio di quanto avrei potuto. – hmjd

+0

@GiovanniAzua: non è il membro dati, ma il suo tipo è preceduto da 'typedef'. – celtschk