fuchsto / cpppc-18

4 stars 4 forks source link

Redefinition?! #4

Closed jakubo87 closed 6 years ago

jakubo87 commented 6 years ago

`#include

namespace cpppc { // forward declaration template <typename ValueT, ValueT default_value = ValueT()> class list;

template <typename ValueT, ValueT default_value = ValueT()> class list { typedef list<ValueT, default_value> self_t; public:

// list::iterator class iterator { typedef typename list<ValueT, default_value> list_t; typedef typename list_t::list_node list_node_t; typedef typename list_t::iterator self_t; public: iterator() = delete; `

make g++ -std=c++11 -Wall -Wextra -pedantic -I/include -I../ -c vector_test.cc -o vector_test.o In file included from vector_test.cc:7: ../solution/list.h:10:71: Fehler: Redefinition des Standardarguments für »ValueT default_value« template <typename ValueT, ValueT default_value = ValueT()> class list { ^~~~ ../solution/list.h:7:62: Anmerkung: ursprüngliche Definition trat hier auf template <typename ValueT, ValueT default_value = ValueT()> class list; ^ Falls jemand eine Idee hat, wäre sehr dankbar.

MariusHerget commented 6 years ago

Du brauchst in der Klassenimplementierung nicht mehr den default angeben also:

template <typename ValueT, ValueT default_value> class list {...}

Das sollte klappen.

jakubo87 commented 6 years ago

dann meckert er aber über das hier

In file included from vector_test.cc:7: ../solution/list.h:16:25: Fehler: Spezifikation mit geschachteltem Namen erwartet typedef typename list<ValueT, default_value> list_t; ^~~~~~~

jakubo87 commented 6 years ago

der Zeiger sollte auf "list" stehen

MariusHerget commented 6 years ago

Ich hab dort typedef list<ValueT, default_value> list_t;

jakubo87 commented 6 years ago

und bei dir funktionierts?! bei mir meckert er, dass ValueT nicht deklariert wurde...

jakubo87 commented 6 years ago

hab ja derzeit selbst ein Problem, weshalb ich nicht für die Richtigkeit meiner Lösung garantieren kann. Da es aber nur eine forward linked list ist (heißt es so..?) reicht dir ein Vergleich mit "const Iterator _end=nullptr;" um das Ende zu bestimmen. Was den Anfang betrifft: "iterator _begin=_end" zu anfang. Da nicht "const" kannst du ihn dann auf das erste Element zeigen lassen und wenn du den Wert brauchst, dereferenzieren... bzw wieder auf _end wenn das letzte element gepoppt wurde. Iterator hat ja nur ein Member und das ist selbst ein pointer auf eine list_node. Wenn ich es richtig verstehe kannst du auf _head und _tail komplett verzichten.

MariusHerget commented 6 years ago

Nächste Möglichkeit:

  template<typename ValueT, ValueT default_value> class list;
  template <
    typename ValueT,
    ValueT   default_value = ValueT()>
  class list {...}
jakubo87 commented 6 years ago

mit Raten komme ich da befürchte ich fürs erste weiter. habe auch schon einige Möglichkeiten durchprobiert. Auch mit friend und anderen Quatsch...

MariusHerget commented 6 years ago

@jakubo87 die oben gennanten Möglichkeiten funktionieren bei mir alle. Aber okay, warten wir mal auf das Wissen von @fuchsto .