vererbte TemplateKlasse mit string element
-
oh.. eigentlich nicht. aber jetzt weiß ich es.
-
Erstens: die Angabe 'const string' als Template-Parameter sieht irgendwie illegal aus - bist du sicher, daß das funktioniert?
Zweitens: In der Anweisung
ap[1]=2.2,"Hans";hat der Teil hinter dem Komma keinerlei Auswirkung.Drittens: Du kannst keine double und Strings miteinander addieren.
-> Das Programm sieht zwar aus wie C++, aber ich bezweifle, daß es so überhaupt compiliert werden kann.
PS: Und viertens: sfds
-
mark79 schrieb:
oh.. eigentlich nicht. aber jetzt weiß ich es.
Dann füge sie doch bitte in deinen Beitrag ein.
-
#include <iostream> #include <exception> #include <string> using namespace std; template <class T, const unsigned int size, const string > class Array { protected: T arr[size]; string name; public: // T &operator[](unsigned int index) { return arr[index]; } T &at(unsigned int index, string m) { name =m; try { if (index < size && m=="karl") return arr[size]; else throw std::domain_error("invalid index"); } catch (exception &exc) { cout << exc.what() <<endl; } } }; //////////////////////////////////////////////////////////////////////// // ABGELEITETE TEMPLATEKLASSE template <class T, const unsigned int size ,const string > class ArrayPlus : public Array<T, size, string> { private: public: ArrayPlus(const T &initval, string m) //Array füllen { for (int i = 0; i < size; i++) arr[i] = (initval +"name"); } }; int main(void) { ArrayPlus<char, 3, string> ap(15.1,"Hans"); //double-> zahlenform;3->für arraysize + initialisierung 1.1 ap[1] = 2.2,"hans"; cout << ap[0] << endl; cout << ap[1] << endl; cout << ap[2] << endl; cout << ap.at(2) << endl; cout << ap[3] << endl; // Zufallswert, kein range-check! cout << ap.at(3) << endl; // Abbruch mit out_of_range Exception!Das wäre auch meine frage...const string als template Parameter???
-
mark79 schrieb:
Das wäre auch meine frage...const string als template Parameter???
Das hast du doch geschrieben. Also solltest du auch wissen, was es darstellen soll.
Wie gesagt - nach meinem Kenntnisstand ist das nicht erlaubt. Du darfst als Template-Parameter nur 'Werte' angeben, die der Compiler bereits auswerten kann, das umfasst Datentypen (typename), Ganzzahl-Compilezeitkonstanten und Adressen von statisch gebundenen Variablen.Also nochmal: Geht das Programm wirklich so durch den Compiler? Wenn ja, durch welchen?
-
Habe doch geschrieben, dass es so nicht funktioniert...Also nicht durch den Compiler geht.
-
Dann erklär nochmal, was du genau vorhast mit dem Programm? Die meisten Stammgäste kennen sich gut genug mit c++ aus, um dir bei konkreten Problemen weiterhelfen zu können, aber aus so einem Programmschnipsel und der Erklärung "das klappt nicht" kann niemand etwas machen.
-
OK, ist wirklich ungenügend ausgedrückt.
Ich wollte im prinzip über meine template Klasse nicht nur mein Array füllen sondern auch noch über die initialisierung ein String übergeben....
Also mein Programm ist wirklich Schrott.ArrayPlus<char, 3, string> ap(15.1,"Hans");hier wollte ich mein Array mit 15.1 initialisieren und gleichzeitig so als
"index" Hans übergeben.
Aber ich glaube ich muß das ganze noch mal grundlegend überdenken!
aber trotzdem danke.
werde mich bemühen beim nächsten mal klarere Fragen zu stellen.
-
mark79 schrieb:
Also mein Programm ist wirklich Schrott.
Gut erkannt
Wenn du einen Stringwert zur Initialisierung mitgeben willst, mußt du den nicht als Template-Parameter eintragen, sondern nur im Ctor angeben und füllen:template<typename T,int size> class Array { T vals[size]; public: Array(const T& val) { for(int i=0;i<size;++i) vals[i]=val; } ... }; template<typename T,int size> class ArrayPlus : public Array<T,size> { string name; public: ArrayPlus(const T& val,const string& n) : Array(val), name(n) {} ... };(abgesehen davon - in ein Array<char,...> wirst du nur schwer double-Werte reinpacken können)
-
Ja, verstehe was du meinst.
Also ich werd das wohl Programm mal sanieren.
Danke