2011-12-17 6 views
7

In VC++ 10 il seguente esempio non riesce con errore C2027: "uso del tipo non definito 'X'". Comunque g ++ 4.6 lo compila bene.Come ottenere la dimensione di un argomento modello quando si utilizza CRTP?

template<class T> 
class C 
{ 
    static const size_t size = sizeof(T); 
}; 

class X : public C<X> { }; 

Quindi quale è giusto? E come lo farei affinché funzioni sui compilatori mainstream?

Non è un grosso problema, perché VC++ consente ancora la dimensione di (T) all'interno delle funzioni membro di C. Devo solo ripetere alcune definizioni di tipo lungo che è fastidioso.

EDIT: mi rendo conto che il mio esempio è stato male perché quello che veramente volevo fare era quello di utilizzare la dimensione come un momento della compilazione costante, in questo modo:

template<size_t size> class C2 { }; 

template<class T> 
class C 
{ 
    typedef C2<sizeof(T)> A; 
}; 

class X : public C<X> { }; 

Entrambi i compilatori rifiutano questo modo che io Supponiamo che probabilmente non è possibile, ma come ho detto posso ancora usare sizeof all'interno delle funzioni. Speravo solo di non dover ripetere il typedef in ogni funzione.

template<size_t size> class C2 { }; 

template<class T> 
class C 
{ 
    void foo() { typedef C2<sizeof(T)> A; } 
}; 

class X : public C<X> { }; 

risposta

6

L'elemento statico non può essere inizializzato nella classe stessa, perché il tipo T viene definita, e non è ancora completa.

Tuttavia, è possibile inizializzare al di fuori della classe come:

template<class T> 
class C 
{ 
    static const size_t size; 
}; 

template<typename T> 
const size_t C<T>::size = sizeof(T); //initialization of the static member 

Dovrebbe compilare bene: http://ideone.com/6sNgN

+1

uno era in procinto di inviare la stessa cosa. –

+0

Non penso che questo sia il problema qui perché le costanti di compilazione in tempo reale possono essere inizializzate normalmente all'interno della classe. Potrei accettarlo come soluzione alternativa. – Timo

+0

@Timo: Questo è esattamente il problema. Nel frattempo, il membro statico viene analizzato * e viene effettuato un tentativo di inizializzarlo *, il tipo 'T' non è ancora completo. – Nawaz

Problemi correlati