Ok, sto lavorando con g ++ 4.8.2 e ho il seguente codice (un po 'lungo) che riceve un messaggio di errore su un tipo incompleto. Ho ridotto il codice per un pezzo più piccolo per l'inclusione qui e può essere compilato direttamente:Sizeof failing nel template anche se i tipi sono tutti definiti
#include <cstdlib>
struct S
{
void method(){}
};
template<size_t sz, size_t tot>
class genpool
{
};
template <class T>
class mempool
{
private:
genpool<sizeof(T), 10*sizeof(T)> p;
};
template <class obj, class mthd>
class functor
{
private:
static mempool<functor<obj, mthd> > pool;
};
template <class obj, class mthd>
mempool<functor<obj, mthd> > functor<obj, mthd>::pool;
int main()
{
typedef void (S::*m)();
typedef functor<S, m> fctr;
fctr f;
}
Il messaggio di errore del compilatore è:
g++ jj.C
jj.C: In instantiation of ‘class mempool<functor<S, void (S::*)()> >’:
jj.C:30:30: required from ‘class functor<S, void (S::*)()>’
jj.C:37:8: required from here
jj.C:18:17: error: invalid application of ‘sizeof’ to incomplete type ‘functor<S, void (S::*)()>’
genpool<sizeof(T), 10*sizeof(T)> p;
^
Compilation exited abnormally with code 1 at Thu Apr 9 18:50:06
Ovviamente, il modello funtore è definito sopra e tutti gli argomenti a functor sono stati definiti in modo esplicito. Ciò sembra implicare che la dimensione della funzione dovrebbe essere ben definita. C'è qualcosa che mi manca qui?
--Ron
ho pensato membri dati statici non contribuirebbe alla dimensione di una classe in modo non dovrebbe esserci alcun ricorsione qui ... –
Non importa quale sia la dimensione della classe sarà alla fine. Nel momento in cui dichiari il membro statico, il compilatore non sa quale sia la dimensione della classe perché non ha finito di dichiarare la classe. – Mokosha