Ok, ich arbeite mit g ++ 4.8.2 und habe den folgenden (etwas langen) Code, der eine Fehlermeldung über einen unvollständigen Typ erhält. Ich habe den Code auf einen kleineren Brocken für die Aufnahme hier reduziert und kann direkt erstellt werden:Sizeof in Vorlage fehlgeschlagen, obwohl alle Typen definiert sind
#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;
}
Die Compiler Fehlermeldung lautet:
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
Offensichtlich ist die Vorlage Funktors vorstehend definiert ist und alle Argumente zu Funktor wurden explizit definiert. Dies scheint mir zu implizieren, dass die Größe der Funktion gut definiert sein sollte. Gibt es etwas, das mir hier fehlt?
--Ron
Ich dachte, statische Datenelemente nicht auf die Größe einer Klasse beitragen würde, so gibt es keine Rekursion hier sein sollte ... –
Es ist egal, was die Größe der Klasse wird schließlich sein. An dem Punkt, an dem Sie den statischen Member deklarieren, weiß der Compiler nicht, wie groß die Klasse ist, da die Klasse noch nicht deklariert wurde. – Mokosha