============== Beispiellösung [TOC] ============== :import: session04/step01/array.hpp :import: session04/step01/test-array.cpp ---- SHELL (path=session04/step01,hostname=theon) -------- g++ -Wall -o test-array test-array.cpp valgrind ./test-array ---------------------------------------------------------- Zu den Template-Abhängigkeiten gehören * der _default constructor_, der implizit durch den `new`-Operator benötigt wird, und * der Zuweisungs-Operator, der von `std::copy` verwendet wird. Interessanterweise wird ein Kopierkonstruktor nicht benötigt, obwohl die Array-Klasse selbst einen anbietet: :import: session04/step01/test1.cpp ---- SHELL (path=session04/step01,hostname=theon) -------- g++ -Wall -o test1 test1.cpp ./test1 ---------------------------------------------------------- Das liegt daran, dass wir die Elemente nicht kopier-konstruieren, sondern zuerst mit dem `default constructor` anlegen, bevor dann durch den Kopierkonstruktor die Elemente mit `std::copy` einzeln einander zugewiesen werden. Wenn wir das vermeiden wollen, müssen wir das Belegen von Speicher von dem Konstruieren trennen. Die Sache sieht völlig anders aus, wenn wir den Zuweisungsoperator herausnehmen: :import: session04/step01/test2.cpp ---- SHELL (path=session04/step01,hostname=theon) -------- g++ -Wall -o test2 test2.cpp ---------------------------------------------------------- Zu den Template-Abhängigkeiten gehört natürlich auch der _default constructor_. Testen wir mal: :import: session04/step01/test3.cpp ---- SHELL (path=session04/step01,hostname=theon) -------- g++ -Wall -o test3 test3.cpp ---------------------------------------------------------- Hm... das hat der Übersetzer akzeptiert. Folgendes Beispiel geht jedoch schief: :import: session04/step01/test4.cpp ---- SHELL (path=session04/step01,hostname=theon) -------- g++ -Wall -o test4 test4.cpp ---------------------------------------------------------- Warum? Der Punkt ist der, dass der Übersetzer tatsächlich sich beim Instantiieren nur auf die Code-Teile beschränkt, die tatsächlich verwendet werden. Bei `test3.cpp` wurde nur der _default constructor_ verwendet, der den `new`-Operator nicht verwendet. Der reguläre Konstruktor kam nicht zum Einsatz. Deswegen kam es nicht zu einem Fehler, obwohl eine Template-Abhängigkeit nicht erfüllt war. Erst bei `test4.cpp` kam der reguläre Konstruktor zum Einsatz und somit blieb dem Übersetzer hier nichts anderes übrig, als eine Fehlermeldung zu generieren. Andere Übersetzer verhalten sich hier ähnlich. Hier das gleiche Beispiel mit dem Oracle-Studio-Übersetzer: ---- SHELL (path=session04/step01,hostname=theon) -------- CC -std=c++11 -o test3 test3.cpp CC -std=c++11 -o test4 test4.cpp ---------------------------------------------------------- :navigate: up -> doc:index back -> doc:session04/page01 next -> doc:session04/page03