2011-01-09 15 views
6

Ich habe die folgende Klasse:Warum ist dieser Standardvorlagenparameter nicht zulässig?

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

Und versuchen, eine automatische Variable wie folgt zu instanziiert:

AlignedMemory blah(512, 512); 

Dies gibt den folgenden Fehler:

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

Was ich tue, falsch ? Ist void kein erlaubter Standardparameter?

+0

Haben Sie einen Code, der den Bezeichner 'buf' irgendwo enthält? –

+1

@Charles: 'buf' ist ein Tippfehler. Sieh dir das an: http://www.ideone.com/32gVl ... etwas fehlt vor dem Kopf. : P – Nawaz

Antwort

11

Ich denke, dass Sie schreiben müssen:

AlignedMemory<> blah(512, 512); 

Siehe 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

Ihre Syntax ist falsch:

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

korrekte Syntax ist das:

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

Die Fehlermeldung selbst gibt diesen Hinweis. Schau es dir nochmal an:

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

PS: Ich bin mir sicher 'buf' ist ein Tippfehler. Du wolltest 'blah' schreiben - der Name deiner Variablen!

Verwandte Themen