Was geht hier vor?
-
Hallo,
mir ist in Principles and Practice using C++ by Bjarne Stroustrup ein Tippfehler (ich glaube?) aufgefallen, habe es zum Spaß aber mal so übernommen und es kompiliert fehlerfrei:
vector::vector(const vector& arg) :sz{arg.sz}, elem{new double[arg.sz]} { copy(arg, arg + sz, elem); // std::copy }
Eigentlich müsste das doch so aussehen:
copy(arg.elem, arg.elem + sz, elem); // std::copy
Und beim copy-assignment-operator schreibt er es dann auch so.
Was mich wundert ist, dass Ersteres kompiliert und warum. Könnte mir das bitte jemand kurz erklären?
LG
-
Hat die Klasse vielleicht einen
operator double*
?
-
http://www.stroustrup.com/Programming/PPP2errata.html
Poste doch mal deinen ganzen Code.
-
Ich habe es schon korrigiert, aus Angst, aber die Klasse sieht so aus (Uni Aufgabe, ich gehe davon aus std::vector zu nehmen würde man nicht akzeptieren^^):
template<typename T> class Stack { public: Stack() = default; ~Stack(); Stack(const Stack&); Stack& operator=(const Stack&); Stack(Stack&&); Stack& operator=(Stack&&); std::size_t size() const { return sz; } bool empty() const { return !sz; } T& top(); const T& top() const; void push(const T& value); void pop(); void reserve(std::size_t n); // increase space to n private: T* elem{}; std::size_t sz{}; std::size_t space{}; };
Visual Studio 2017 RC, kompiliert Fehlerfrei (nachdem ich mit C4996 zu kämpfen hatte, welcher aber auch kommt bei "richtiger" Anwendung).
call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct.
template<typename T> Stack<T>::Stack(const Stack& other) :elem{ new T[other.sz] }, sz{ other.sz } { std::copy(other, other + sz, elem); }
Das errata macht genauso wenig Sinn:
s/copy(arg,arg.sz,elem);/copy(arg.elem,arg.elem.sz,elem);/
elem ist ein T* und meines Wissens nach haben pointer keinen Member 'sz'. Das soll ja wohl heißen
copy(arg,arg+sz,elem);/copy(arg.elem, arg.elem + sz, elem
Aber keine Ahnung, vielleicht bilde ich mir nur etwas ein. Ich nehme es keinem übel, wenn in >1000 Seiten noch irgendwo ein paar Fehler sind.