Ok, tôi đang làm việc với g ++ 4.8.2 và có đoạn mã sau (hơi dài) nhận được thông báo lỗi về loại không đầy đủ. Tôi đã giảm mã để một đoạn nhỏ để đưa vào đây và có thể được biên dịch trực tiếp:Sizeof thất bại trong mẫu mặc dù tất cả các loại được xác định
#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;
}
Thông điệp biên dịch lỗi là:
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
Rõ ràng, mẫu functor được định nghĩa ở trên và tất cả các đối số để functor đã được xác định rõ ràng. Điều này dường như hàm ý rằng hàm sizeof cần được xác định rõ. Có điều gì tôi thiếu ở đây không?
--Ron
Tôi nghĩ các thành viên dữ liệu tĩnh sẽ không góp phần vào kích thước của một lớp học vì vậy không nên có bất kỳ đệ quy ở đây ... –
Nó không có vấn đề gì kích thước của lớp cuối cùng sẽ được. Tại thời điểm bạn khai báo thành viên tĩnh, trình biên dịch không biết kích thước của lớp là vì nó chưa hoàn thành khai báo lớp. – Mokosha