2012-08-15 20 views
8

Tratando de tipear la alineación de mi memoria, salí con la siguiente construcción (que todavía está un poco en progreso porque necesito corregirla) la versión de GNU):error de plantilla: sin tipo ".. [con T = T] no es un nombre de 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 

y luego trato de utilizar de esta manera:

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

pero luego me sale el siguiente mensaje de error:

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

¿Alguien puede aconsejar qué está mal aquí?

Respuesta

10

aptr32 depende de T modo:

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

Para una explicación más detallada sobre el uso de typename ver Where and why do I have to put the "template" and "typename" keywords?

+0

Niza, gracias! Estoy realmente desconcertado por este ... ¿cómo es que un miembro de datos tiene que tener un marcador typedef al frente para compilar? es un poco raro. –

+0

@GiovanniAzua, la respuesta vinculada explica el uso de 'typename' mucho mejor que pude. – hmjd

+0

@GiovanniAzua: No es el miembro de datos, pero su tipo tiene el prefijo 'typedef'. – celtschk

Cuestiones relacionadas