2009-12-30 17 views
6

Ho questo codice per port da Windows a Linux.Campo modello statico della classe template?

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 

Compilare con VS2008, ma non con g ++ 4.3.2. L'errore che ricevo è:

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

Qualcuno sa come farlo compilabile via g ++?

Grazie!

+1

penso che il suo altro interno MSVC++, anche se non sono sicuro. Qualcuno per favore getta un po 'di luce su di esso. –

risposta

8

Questo funziona con GCC 3.4 & 4.3 così come 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

Sembra essere una soluzione al problema. Grazie mille! – Alex

-1

Se si estrae la dichiarazione di a fuori dalla classe, questa viene compilata su cygwin con g ++ v. 3.4.4.

A proposito, perché non utilizzare std::vector invece di CVector?

+0

No Non capisco perché non ha nemmeno bisogno di inizializzare il membro statico. Potresti spiegarci un po '? –

+0

Non lo sta inizializzando, perché non gli sta dando alcun valore. Lo sta solo dichiarando. – Dima

+0

In realtà CTestClass :: a dipende dal parametro template 'n'. Guarda attentamente il codice. perché non usare std :: vector invece di CVector? Non è il mio codice, ma supponiamo che ci fossero delle ragioni. E infatti non importa - il codice non verrà compilato nemmeno con std :: vector. – Alex

0

realtà CTestClass :: A non dipende dal parametro template 'n'. Guarda attentamente il codice.

why not use std::vector instead of CVector?

Non è il mio codice, ma supponiamo che ci fossero alcuni motivi. E infatti non importa - il codice non verrà compilato con std::vector neanche.

+0

Hai ragione. Scusa, l'ho perso. Ma prova a prendere la dichiarazione sulla linea 24. L'ho appena provato, e si compila con g ++ su cygwin. – Dima

+0

E la funzionalità di questo codice verrà salvata in questo caso? – Alex

+1

Sì, non ci sarà alcun problema al momento della compilazione (se cancella quella riga) ma il suo programma non si collegherà quindi. –

-1

In CTestClass, la dimensione è un'enumerazione e non un int (dalla norma è carico di attuazione, enum Non deve essere un numero intero). Provare a utilizzare uno statico const int Size = ...

+0

non funziona. ha lo stesso errore. – Alex

Problemi correlati