2011-12-17 20 views
7

Trong VC++ 10 ví dụ sau không thành công với lỗi C2027: "sử dụng kiểu không xác định 'X'". Tuy nhiên g ++ 4.6 biên dịch nó tốt.Làm thế nào để có được kích thước của một đối số mẫu khi sử dụng CRTP?

template<class T> 
class C 
{ 
    static const size_t size = sizeof(T); 
}; 

class X : public C<X> { }; 

Vậy cái nào đúng? Và làm thế nào tôi sẽ làm điều này để nó hoạt động trên các trình biên dịch chính thống?

Nó không phải là một thỏa thuận lớn, mặc dù VC + + vẫn cho phép sizeof (T) bên trong chức năng thành viên của C. Tôi chỉ cần lặp lại một số định nghĩa kiểu dài gây khó chịu.

EDIT: Tôi nhận ra ví dụ của tôi là xấu bởi vì những gì tôi thực sự muốn làm là để sử dụng kích thước như một thời gian biên dịch liên tục, theo cách này:

template<size_t size> class C2 { }; 

template<class T> 
class C 
{ 
    typedef C2<sizeof(T)> A; 
}; 

class X : public C<X> { }; 

Cả hai trình biên dịch từ chối này vì vậy tôi giả sử nó có lẽ là không thể, nhưng như tôi đã nói tôi vẫn có thể sử dụng các hàm bên trong sizeof. Tôi chỉ hy vọng tôi sẽ không phải lặp lại typedef bên trong mọi chức năng.

template<size_t size> class C2 { }; 

template<class T> 
class C 
{ 
    void foo() { typedef C2<sizeof(T)> A; } 
}; 

class X : public C<X> { }; 

Trả lời

6

Thành viên tĩnh không thể được khởi tạo trong chính lớp đó, vì loại T đang được xác định và chưa hoàn thành.

Tuy nhiên, bạn có thể khởi tạo nó bên ngoài lớp học như:

template<class T> 
class C 
{ 
    static const size_t size; 
}; 

template<typename T> 
const size_t C<T>::size = sizeof(T); //initialization of the static member 

Cần biên dịch tốt: http://ideone.com/6sNgN

+1

1 là chỉ là về để gửi cùng một điều. –

+0

Tôi không nghĩ đây là vấn đề ở đây bởi vì hằng số biên dịch tích phân có thể được khởi tạo bên trong lớp. Tôi có thể chấp nhận nó như là một cách giải quyết mặc dù. – Timo

+0

@Timo: Đó chính là vấn đề. Vào lúc đó, thành viên tĩnh được phân tích cú pháp * và một nỗ lực đang được thực hiện để khởi tạo nó *, kiểu 'T' chưa hoàn thành. – Nawaz

Các vấn đề liên quan