================ Lösungsvorschlag ================ Hier ist ein Lösungsvorschlag: :import: session9/matrix_class8.cpp Zu beachten ist hier die Methode `print`: ---- CODE (type=cpp) ---------------------------------------------------------- void print() { for (std::size_t i = 0; i < m; ++i) { std::printf(" "); for (std::size_t j = 0; j < n; ++j) { /* be careful here, printf is not polymorph */ std::printf(" %4.1lf", (double) data[i*incRow + j*incCol]); } std::printf("\n"); } } ------------------------------------------------------------------------------- Das `printf`-Format `lf` verlangt hier explizit einen `long float`-Parameter, also `double`. Hier erfolgt keine automatische Anpassung an den Template-Parameter `T`. Das Problem wird hier abgemildert, indem eine explizite Typkonvertierung zu `double` erfolgt in der Hoffnung, dass dies von `T` unterstützt wird und sinnvoll ist. Verallgemeinerbar ist dies nicht wirklich, da nicht notwendigerweise der gesamte Wertebereich von `T` in `double` repräsentierbar ist. Und bei einigen Typen würde es überhaupt nicht funktionieren, d.h. sie könnten nicht für `T` eingesetzt werden. Beispiel: ---- CODE (type=cpp) ---------------------------------------------------------- struct Complex { double re; double im; }; int main() { Matrix A(3, 3, StorageOrder::ColMajor); A.init(); std::printf("A =\n"); A.print(); } ------------------------------------------------------------------------------- Wenn wir dies zu übersetzen versuchen, setzt der Übersetzer in der Matrix-Klasse bei der Instantiierung überall `T` durch `Complex` und überprüft danach, ob das so erzeugte Resultat zulässig ist: ---- SHELL (path=session9) ------------------------ g++ -Wall -std=gnu++11 -o matrix_class9 matrix_class9.cpp --------------------------------------------------- :navigate: up -> doc:index back -> doc:session9/page01 next -> doc:session9/page03