2013-06-12 9 views
12

Code:Standardargument für Template-Parameter für die Klasse umschließenden

template <typename element_type, typename container_type = std::deque<element_type> > 
class stack 
{ 
    public: 
     stack() {} 
     template <typename CT> 
     stack(CT temp) : container(temp.begin(), temp.end()) {} 
     bool empty(); 
    private: 
     container_type container; 
}; 

template <typename element_type, typename container_type = std::deque<element_type> > 
bool stack<element_type, container_type>::empty() 
{ 
    return container.empty(); 
} 

Wenn ich kompilieren es den Fehler gibt.

Standardargument für Template-Parameter für die Klasse 'bool stack<element_type,container_type>::empty()'

umschließenden Warum ist der Compiler beschweren und wie kann ich es funktioniert?

+0

Ist das wirklich die vollständige Fehlermeldung? Es sieht so aus als ob etwas fehlt ... –

+0

@TimoGeusch: Es ist in der Tat wenn mit g ++ und '--std = C++ 0x' kompiliert. Obwohl eigentlich richtig, ist es auf den ersten Blick nicht sehr hilfreich:/ –

Antwort

20

Sie versuchen, ein Standardargument für die zweiten Template-Parameter zu stack zweimal zu liefern. Standard-Vorlagenargumente können ebenso wie Standardfunktionsargumente nur einmal definiert werden (pro Übersetzungseinheit); nicht einmal die exakt gleiche Definition zu wiederholen ist erlaubt.

Geben Sie einfach das Standardargument am Anfang ein, an dem Sie die Klassenvorlage definieren. Danach lassen Sie es aus:

template<typename element_type,typename container_type> 
bool stack<element_type,container_type>::empty(){ 
    return container.empty(); 
} 
+0

vielen dank, es funktioniert – huals

2

Dieser Standardparameter ist nach Syntax ein Standardparameter für die Klasse und nur bei der Klassendeklaration sinnvoll.

Wenn Sie diese Funktion aufrufe würden ...

stack<foo,bar>().empty(); 

Sie nur die Template-Parameter auf der Seite des Klassennamen hat, für die Sie bereits Standardparameter an dem Punkt der Vorlage Klassendeklaration zur Verfügung gestellt.

können Sie das Problem lösen, indem sie einfach den Standardparameter aus der Funktionsdefinition zu entfernen:

template<typename element_type,typename container_type> 
bool stack<element_type,container_type>::empty(){ 
    return container.empty(); 
} 
+0

Sie haben recht, vielen Dank! – huals

Verwandte Themen