2011-01-09 31 views
6

Tôi có lớp sau:Tại sao thông số mẫu mặc định này không được phép?

template <typename Type = void> 
class AlignedMemory { 
public: 
    AlignedMemory(size_t alignment, size_t size) 
     : memptr_(0) { 
     int iret(posix_memalign((void **)&memptr_, alignment, size)); 
     if (iret) throw system_error("posix_memalign"); 
    } 
    virtual ~AlignedMemory() { 
     free(memptr_); 
    } 
    operator Type *() const { return memptr_; } 
    Type *operator->() const { return memptr_; } 
    //operator Type &() { return *memptr_; } 
    //Type &operator[](size_t index) const; 
private: 
    Type *memptr_; 
}; 

Và cố gắng để nhanh chóng một biến tự động như thế này:

AlignedMemory blah(512, 512); 

này cung cấp cho các lỗi sau:

src/cpfs/entry.cpp:438: error: missing template arguments before ‘blah’

Tôi đang làm gì sai ? void có phải là thông số mặc định được cho phép không?

+0

Bạn có mã nào bao gồm số nhận dạng 'buf' ở bất kỳ đâu không? –

+1

@Charles: 'buf' là lỗi đánh máy. Xem này: http://www.ideone.com/32gVl ... một cái gì đó là mất tích trước khi tâm trí. : P – Nawaz

Trả lời

11

Tôi nghĩ rằng bạn cần phải viết:

AlignedMemory<> blah(512, 512); 

Xem 14,3 [temp.arg]/4:

When default template-arguments are used, a template-argument list can be empty. In that case the empty <> brackets shall still be used as the template-argument-list.

5

cú pháp của bạn là sai:

AlignedMemory blah(512, 512); //wrong syntax 

cú pháp đúng là:

AlignedMemory<> blah(512, 512); //this uses "void" as default type! 

Bản thân thông báo lỗi đưa ra gợi ý này. Xem lại lần nữa:

src/cpfs/entry.cpp:438: error: missing template arguments before ‘buf’

PS: Tôi chắc chắn 'buf' là lỗi đánh máy. Bạn muốn viết 'blah' - tên biến của bạn!

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