2011-01-09 97 views
6

我有以下類:爲什麼這個默認模板參數不被允許?

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_; 
}; 

,並試圖實例化一個像這樣的自動變量:

AlignedMemory blah(512, 512); 

這提供了以下錯誤:

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

我在做什麼錯? void不是允許的默認參數嗎?

+0

您是否有任何代碼在任何地方包含標識符「buf」? – 2011-01-09 11:51:52

回答

11

我認爲你需要寫:

AlignedMemory<> blah(512, 512); 

見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

你的語法是錯誤的:

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

正確的語法是這樣的:

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

錯誤消息本身給出了這個提示。再看一遍:

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

PS:我確定'buf'是一個錯字。你想寫'blah' - 你的變量的名字!

相關問題