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> { };
uno era in procinto di inviare la stessa cosa. –
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
@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