Klassentemplate-kann Objekt nicht erzeugen



  • Hallo Leute,

    ich habe folgendes Problem und bitte um eure Hilfe.
    Hier erstmal der Code, sorry ist etwas lang:

    template <class Transp> 
    class Race{
    
        private:
     		char *name; // Name des Rennens
    		Transportmittel **Tn;
    
            // Durch virtuelle Klassen werden nur noch zwei Klassen-Objekte gebraucht
            Motorisiert *Motor;
            NMotorisiert *NMotor;
    
            // und nur eine Anzhal für jeweils das Tn-Objekt
            int anz;
    
    		double laenge; // Laenge der Rennbahn
    		double t; // Zeit 
    
    		// private Methoden: 
    		void spielfeld(); 
    		// nicht motorisierte Teilnehmer: 
    		void set_teilnehmer(char *n,const char *cat,double v );
    		//  motorisierte Teilnehmer: 
    		void set_teilnehmer(char *n,const char *cat,double v, double a);
    
        public:
        // Kopierkonstruktor
    
    		Race(Race & h);
    		// Konstruktor mit den nötigsten Initialisier-Werten:
            Race(char *n, double l);
    		//Defaultkonstruktor
            Race();
    		//Destruktor
    		virtual ~Race();
    		// weitere Methoden
    		void anmeldung();
    		void rennen();
    		void siegerehrung();
            void rennende();              
    };
    
    //Konstruktoren und Destruktor------------------------------------------------->
    template <class Transp>
    Race<Transp>::Race(Race &K){
    
            return;
    }
    template <class Transp>
    Race<Transp>::Race(char *n, double l):
            laenge(l),
            t(0),
            Tn(NULL),
            anz(0)
                            {
     		name = new char;
            name = n;
            printf("Ein Rennen mit Namen %s wird ausgeschrieben.\n",n);
    }
    template <class Transp>
    Race<Transp>::Race():
            Tn(NULL),
            anz(0)
            {
            name = new char;
            name = "noname";
            printf("Ein Rennen noch ohne Namen wird ausgeschrieben.\n");
    }
    template <class Transp>
    Race<Transp>::~Race(){ 
            printf("Das Rennen mit Namen %s ist zu Ende.\n",name);
            delete [] Tn;
    	    return; 
    }
    
    //Methoden--------------------------------------------------------------------->
    template <class Transp>
    void Race<Transp>::Race::anmeldung(){
    
    	// Anmeldung der Fahrraeder:
    	set_teilnehmer("Klapprad","Fahrrad",8.5);
        set_teilnehmer("Mountainbike","Fahrrad",50.5); 
    
        // Anmeldung der Autos:
        set_teilnehmer("Renault","Auto",700.50,10000.50); 
    	set_teilnehmer("Audi","Auto",300.50,20000.50); 
    	set_teilnehmer("BMW","Auto",400.50,30000.00);
    
    	/*// Anmeldung ... : 
    	set_teilnehmer("Osterhase","Tier",2.85);*/
    }
    template <class Transp>
    // motorisierte Teilnhmer:
    void Race<Transp>::set_teilnehmer(char *n,const char *cat,double v, double a){
    
        // Aufruf der resize-Funktion durch Tn (Zeiger auf Zeiger)
        Tn = resize(Tn,anz,anz+1);
    
         // Wenn die Kategorie "Auto" ist,
        // wird ein Auto-Objekt erstellt
        if(strcmp(cat,"Auto")==0){
           Motor = new Auto;
        }
        // Wenn die Kategorie "Motorrad" ist,
        // wird ein Motorrad-Objekt erstellt
        else if(strcmp(cat,"Motorrad")==0){
           Motor = new Motorrad;
        }
        else if(strcmp(cat,"Kutsche")==0){
           NMotor = new Kutsche;
        }
        else if(strcmp(cat,"Fahrrad")==0){
           NMotor = new Fahrrad;
        }
     // Wenn die Kategorie nicht definierbar ist,
     // wird eine Meldung ausgegeben
        else{
           printf("%s kommt erst naechste Woche. Es liegt eine ungueltige Anmeldung vor.\n",n);
        }
    
     // Den Objekten werden trotz der Bedingungen
     // ihre entsprechenden Parameter übergeben
     // (Dank virtuellen Klassen und Zeiger auf Zeiger)
        if(strcmp(cat,"Auto") == 0 || strcmp(cat,"Motorrad") == 0){
          Tn[anz] = Motor;
          Tn[anz]->set_name(n);
          Tn[anz]->set_vmax(v);
          Tn[anz]->set_a(a);
          Tn[anz]->set_x(0);
          anz++;
        }
        return;
    }
    template <class Transp>
    void Race<Transp>::spielfeld()
    {
    	 printf(" \n");
    	 printf("Titel des Rennens: %s, Dauer: %f Stunden \n",name,t);
    	 printf("\n");
    
    	int anz_striche = 69;
    	double del_laenge = laenge/anz_striche;
    	int ns = 0; // Anzahl der zurueckgelegten Striche
    
    	int i=0,j=0;
    
            // Durch die virtuelle Klasse und dem Zeiger auf Zeiger
            // ist nur noch eine Schleife notwendig.
            // Die Schleife zeichnet wie vorher die Spielfläche,
            // mit dem Unterschied dass diesmal das Objekt Tn verwendet wird
    
    	for( i=0;i<anz;i++){
    		  printf("  |---------=---------=---------=---------=---------=---------=---------|\n");
    		  ns = (int)(Tn[i]->put_x()/del_laenge);
    		  printf("%i |",i+1);
    		  for (j=0;j<ns ;j++ ){
    			printf("%c",'>');
    		  }
    		  for ( j=0;j<anz_striche-ns && ns<anz_striche ;j++ ) {
    			printf("%c",' ');
    		  }
    		  printf("| %s\n",Tn[i]->put_name());
    	} // Ende Auflisten der Fahrzeuge
    
        printf("  |---------=---------=---------=---------=---------=---------=---------|\n");
    	printf(" \n");
    
    	fflush(stdout);
    
    	return;
    }
    template <class Transp>
    void Race<Transp>::siegerehrung()
    {
    
    	double xmax = 0;
     	int imax = 0;
     	int i = 0;
    
            // Die Schleife durchläuft die Anzhal der Teilnehmer
            // und sucht den größten xmax raus.
            // Der Gewinner wird gespeicher und ausgegeben!
    	for(i=0;i<anz;i++)
            {
             if(Tn[i]->put_x() >= xmax)
             {
    	  imax = i;
    	  xmax = Tn[i]->put_x();
             }
    	}
    
    	// Endgueltiger Sieger:
            printf("Der Sieger ist das Fahrzeug mit dem Namen %s !\n",Tn[imax]->put_name());
    
    	printf("\n");
    
    	return;
    }
    template <class Transp>
    void Race<Transp>::rennen(){
    
     	int i=0; // Laufvariable
    	t = 0;
    	double del_t = 0.01; // Taktzeit
    
    	int zielerreicht = 0;
    
            // Auch hier wird nur eine Schleife nötig sein
            // Die Schleife durchläuft die Anzahl der Fahrzeuge,
            // und zeichnet den Verlauf der Strecke der Fahrzeuge
    	while (zielerreicht == 0 && anz>0){
    		t = t+del_t;
    		// Autos fahren:
     		for ( i=0;i<anz;i++ ){
    			Tn[i]->calc_x(t);
                            //Tn[i]->calc_x(t, Tn[i]->put_x(), t-del_t);
    			zielerreicht = zielerreicht || (Tn[i]->put_x()>=laenge);
    		} // Ende for
    	}// Ende while
    
    	spielfeld();
    
    	return;
    }
    template <class Transp>
    void Race<Transp>::rennende()
    {
    	delete [] Tn;
    	return; 
    }
    

    Es soll ein Objekt des Klassentemplates in der main erzeugt werden. Dies will mein Compiler aber nicht und meldet diese Fehlermeldung:

    `Transp' undeclared (first use this function) 
    (Each undeclared identifier is reported only once for each function it appears in.)
    
    template argument 1 is invalid  
    
    invalid type in declaration before '(' token 
    initializer expression list treated as compound expression
    

    Ich arbeite zum ersten mal mit Templates und weiß deshalb nichts mit der Fehlermeldung anzufangen. In meinem Buch wurde es auch so angegeben.
    Hat vielleicht jemand einen Lösungsvorschlag?
    Danke schon mal



  • Hi, das ist zuviel Code, um das es sich einer anschauen würde.
    Poste mal lieber auch die Stelle in main(), wo das Template instanziert wird und wo und in welcher Zeile, welcher Fehler kommt ...



  • Und pack die decleration und definition in die Header-Datei (bei Templates) ...



  • Danke für die Antworten, ich hab das Problem allerdings schon gelöst. Ich hab sowas gehabt in der main

    Race<Transp> T;
    

    und es muss so sein.

    Race<Auto> T;
    

    Hatte das mit den Parametern in den Templates nicht geschnallt, aber jetzt ist mir ein Licht aufgegangen 🙂


Anmelden zum Antworten