2009-12-30 18 views
6

Tengo este código para portar desde windows a linux.Campo de plantilla estática de la clase de plantilla?

template<class T, int Size> 
class CVector { 
/* ... */ 
}; 

template<int n, int m> 
class CTestClass { 
public: 
enum { Size = 1 << n }; 
private: 
static CVector<int, Size> a; // main.cpp:19 
}; 

template<int n, int m> 
CVector<int, CTestClass<n, m>::Size> CTestClass<n, m>::a; // main.cpp:24 

Compila con VS2008, pero no con g ++ 4.3.2. El error que recibo es:

main.cpp:24: error: conflicting declaration ‘CVector CTestClass::alpha_to’

main.cpp:19: error: ‘CTestClass< n, m >::alpha_to’ has a previous declaration as ‘CVector< int, CTestClass< n, m >::Size > CTestClass< n, m >::alpha_to’

main.cpp:24: error: declaration of ‘CVector< int, CTestClass< n, m >::Size > CTestClass< n, m >::alpha_to’ outside of class is not definition

¿Alguien sabe cómo hacer que compilables a través de g ++?

Gracias!

+1

Creo que es otra extensión MSVC++, aunque no estoy seguro. Alguien arroje algo de luz sobre eso. –

Respuesta

8

Esto funciona con gcc 3.4 & 4.3, así como VC8:

template<class T, int Size> 
class CVector { 
/* ... */ 
}; 

template<int n, int m> 
class CTestClass { 
public: 
    enum { Size = 1 << n }; 
    typedef CVector<int, Size> Vector; 
private: 
    static Vector a; 
}; 

template<int n, int m> 
typename CTestClass<n,m>::Vector CTestClass<n,m>::a; 
+0

Parece ser la solución al problema. ¡Muchas gracias! – Alex

-1

Si saca la declaración de a fuera de la clase, compila en cygwin con g ++ v 3.4.4. Por favor, use std::vector en lugar de CVector?

+0

No, no entiendo por qué él ni siquiera necesita inicializar el miembro estático. ¿Podrías explicar un poco? –

+0

No lo está inicializando, porque no le está dando ningún valor. Él solo lo está declarando. – Dima

+0

En realidad, CTestClass :: a does depende del parámetro de plantilla 'n'. Mire cuidadosamente el código. ¿por qué no usar std :: vector en lugar de CVector? No es mi código, pero supongo que hubo algunas razones. Y, de hecho, no importa: el código no se compilará con std :: vector tampoco. – Alex

0

En realidad, CTestClass :: a does depende del parámetro de plantilla 'n'. Mire cuidadosamente el código.

why not use std::vector instead of CVector?

No es mi código, pero supongo que hubo algunas razones. Y, de hecho, no importa: el código tampoco se compilará con std::vector.

+0

Tienes razón. Lo siento, lo extrañé. Pero intenta sacar la declaración en la línea 24. Acabo de probarlo y compila con g ++ en cygwin. – Dima

+0

¿Y la funcionalidad de este código se guardará en este caso? – Alex

+1

Sí, no habrá ningún problema en el momento de la compilación (si elimina esa línea) pero su programa no enlazará entonces. –

-1

En CTestClass, el tamaño es una enumeración y no un int (por estándar depende de la implementación, enum no tiene que ser un número entero). Trate de usar una interfaz estática int Tamaño = ...

+0

no funciona. tiene el mismo error. – Alex

Cuestiones relacionadas