Pytanie domyślny argument dla parametru szablonu dla klasy otaczającej


kod:

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();
}

Podczas kompilacji daje błąd.

domyślny argument dla parametru szablonu dla klasy otaczającej 'bool stack<element_type,container_type>::empty()'

Dlaczego kompilator narzeka i jak mogę go uruchomić?


14
2018-06-12 16:57


pochodzenie


Czy to naprawdę kompletny komunikat o błędzie? Wygląda na to, że czegoś brakuje ... - Timo Geusch
@TimoGeusch: Rzeczywiście jest skompilowany z g ++ i --std=c++0x. Chociaż rzeczywiście jest poprawny, na pierwszy rzut oka nie jest bardzo pomocny: / - Sebastian Mach


Odpowiedzi:


Podjęto próbę podania domyślnego argumentu dla drugiego parametru szablonu stack dwa razy. Domyślne argumenty szablonu, podobnie jak domyślne argumenty funkcji, mogą być zdefiniowane tylko raz (na jednostkę tłumaczeniową); nawet powtarzanie tej samej definicji nie jest dozwolone.

Po prostu wpisz domyślny argument na początku, w którym definiujesz szablon klasy. Następnie należy go pominąć:

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

21
2018-06-12 17:04



dziękuję bardzo, to działa - huals


Ten domyślny parametr jest, według składni, parametrem domyślnym dla klasy i ma sens tylko w deklaracji klasy.

Gdybyś zadzwonił do tej funkcji ...

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

masz tylko parametry szablonu na stronie nazwy klasy, dla której już podano domyślne parametry w punkcie deklaracji klasy szablonu.

Możesz rozwiązać problem, usuwając domyślny parametr z definicji funkcji:

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

2
2018-06-12 17:04



masz rację, dziękuję bardzo! - huals