Ok, pracuję z g ++ 4.8.2 i mam następujący (nieco długi) kod, który otrzymuje komunikat o błędzie na temat niekompletnego typu. Mam zmniejszone kodu w mniejszym fragmencie włączenia tutaj i może być zestawiane bezpośrednio:Błąd rozmiaru w szablonie, mimo że wszystkie typy są zdefiniowane
#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;
}
Komunikat o błędzie kompilatora jest:
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
Oczywiście funktor szablon jest określony powyżej, a wszystkie argumenty do funktora zostały wyraźnie zdefiniowane. Wydaje się to sugerować, że funkcja sizeof powinna być dobrze zdefiniowana. Czy jest tu coś, czego mi tutaj brakuje?
--Ron
Myślałem statycznymi członkami danych nie przyczyniłoby się do wielkości klasy, więc nie powinno być żadnych rekursji tutaj ... –
Nie ma znaczenia, jaka wielkość klasy ostatecznie będzie. W momencie, gdy deklarujesz element statyczny, kompilator nie wie, jaki jest rozmiar klasy, ponieważ nie zakończył deklarowania klasy. – Mokosha