<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Klassentemplate-kann Objekt nicht erzeugen]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Problem und bitte um eure Hilfe.<br />
Hier erstmal der Code, sorry ist etwas lang:</p>
<pre><code class="language-cpp">template &lt;class Transp&gt; 
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 &amp; 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-------------------------------------------------&gt;
template &lt;class Transp&gt;
Race&lt;Transp&gt;::Race(Race &amp;K){

        return;
}
template &lt;class Transp&gt;
Race&lt;Transp&gt;::Race(char *n, double l):
        laenge(l),
        t(0),
        Tn(NULL),
        anz(0)
                        {
 		name = new char;
        name = n;
        printf(&quot;Ein Rennen mit Namen %s wird ausgeschrieben.\n&quot;,n);
}
template &lt;class Transp&gt;
Race&lt;Transp&gt;::Race():
        Tn(NULL),
        anz(0)
        {
        name = new char;
        name = &quot;noname&quot;;
        printf(&quot;Ein Rennen noch ohne Namen wird ausgeschrieben.\n&quot;);
}
template &lt;class Transp&gt;
Race&lt;Transp&gt;::~Race(){ 
        printf(&quot;Das Rennen mit Namen %s ist zu Ende.\n&quot;,name);
        delete [] Tn;
	    return; 
}

//Methoden---------------------------------------------------------------------&gt;
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::Race::anmeldung(){

	// Anmeldung der Fahrraeder:
	set_teilnehmer(&quot;Klapprad&quot;,&quot;Fahrrad&quot;,8.5);
    set_teilnehmer(&quot;Mountainbike&quot;,&quot;Fahrrad&quot;,50.5); 

    // Anmeldung der Autos:
    set_teilnehmer(&quot;Renault&quot;,&quot;Auto&quot;,700.50,10000.50); 
	set_teilnehmer(&quot;Audi&quot;,&quot;Auto&quot;,300.50,20000.50); 
	set_teilnehmer(&quot;BMW&quot;,&quot;Auto&quot;,400.50,30000.00);

	/*// Anmeldung ... : 
	set_teilnehmer(&quot;Osterhase&quot;,&quot;Tier&quot;,2.85);*/
}
template &lt;class Transp&gt;
// motorisierte Teilnhmer:
void Race&lt;Transp&gt;::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 &quot;Auto&quot; ist,
    // wird ein Auto-Objekt erstellt
    if(strcmp(cat,&quot;Auto&quot;)==0){
       Motor = new Auto;
    }
    // Wenn die Kategorie &quot;Motorrad&quot; ist,
    // wird ein Motorrad-Objekt erstellt
    else if(strcmp(cat,&quot;Motorrad&quot;)==0){
       Motor = new Motorrad;
    }
    else if(strcmp(cat,&quot;Kutsche&quot;)==0){
       NMotor = new Kutsche;
    }
    else if(strcmp(cat,&quot;Fahrrad&quot;)==0){
       NMotor = new Fahrrad;
    }
 // Wenn die Kategorie nicht definierbar ist,
 // wird eine Meldung ausgegeben
    else{
       printf(&quot;%s kommt erst naechste Woche. Es liegt eine ungueltige Anmeldung vor.\n&quot;,n);
    }

 // Den Objekten werden trotz der Bedingungen
 // ihre entsprechenden Parameter übergeben
 // (Dank virtuellen Klassen und Zeiger auf Zeiger)
    if(strcmp(cat,&quot;Auto&quot;) == 0 || strcmp(cat,&quot;Motorrad&quot;) == 0){
      Tn[anz] = Motor;
      Tn[anz]-&gt;set_name(n);
      Tn[anz]-&gt;set_vmax(v);
      Tn[anz]-&gt;set_a(a);
      Tn[anz]-&gt;set_x(0);
      anz++;
    }
    return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::spielfeld()
{
	 printf(&quot; \n&quot;);
	 printf(&quot;Titel des Rennens: %s, Dauer: %f Stunden \n&quot;,name,t);
	 printf(&quot;\n&quot;);

	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&lt;anz;i++){
		  printf(&quot;  |---------=---------=---------=---------=---------=---------=---------|\n&quot;);
		  ns = (int)(Tn[i]-&gt;put_x()/del_laenge);
		  printf(&quot;%i |&quot;,i+1);
		  for (j=0;j&lt;ns ;j++ ){
			printf(&quot;%c&quot;,'&gt;');
		  }
		  for ( j=0;j&lt;anz_striche-ns &amp;&amp; ns&lt;anz_striche ;j++ ) {
			printf(&quot;%c&quot;,' ');
		  }
		  printf(&quot;| %s\n&quot;,Tn[i]-&gt;put_name());
	} // Ende Auflisten der Fahrzeuge

    printf(&quot;  |---------=---------=---------=---------=---------=---------=---------|\n&quot;);
	printf(&quot; \n&quot;);

	fflush(stdout);

	return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::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&lt;anz;i++)
        {
         if(Tn[i]-&gt;put_x() &gt;= xmax)
         {
	  imax = i;
	  xmax = Tn[i]-&gt;put_x();
         }
	}

	// Endgueltiger Sieger:
        printf(&quot;Der Sieger ist das Fahrzeug mit dem Namen %s !\n&quot;,Tn[imax]-&gt;put_name());

	printf(&quot;\n&quot;);

	return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::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 &amp;&amp; anz&gt;0){
		t = t+del_t;
		// Autos fahren:
 		for ( i=0;i&lt;anz;i++ ){
			Tn[i]-&gt;calc_x(t);
                        //Tn[i]-&gt;calc_x(t, Tn[i]-&gt;put_x(), t-del_t);
			zielerreicht = zielerreicht || (Tn[i]-&gt;put_x()&gt;=laenge);
		} // Ende for
	}// Ende while

	spielfeld();

	return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::rennende()
{
	delete [] Tn;
	return; 
}
</code></pre>
<p>Es soll ein Objekt des Klassentemplates in der main erzeugt werden. Dies will mein Compiler aber nicht und meldet diese Fehlermeldung:</p>
<pre><code class="language-cpp">`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
</code></pre>
<p>Ich arbeite zum ersten mal mit Templates und weiß deshalb nichts mit der Fehlermeldung anzufangen. In meinem Buch wurde es auch so angegeben.<br />
Hat vielleicht jemand einen Lösungsvorschlag?<br />
Danke schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183518/klassentemplate-kann-objekt-nicht-erzeugen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 09:06:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183518.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Jun 2007 18:18:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassentemplate-kann Objekt nicht erzeugen on Tue, 05 Jun 2007 18:18:02 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Problem und bitte um eure Hilfe.<br />
Hier erstmal der Code, sorry ist etwas lang:</p>
<pre><code class="language-cpp">template &lt;class Transp&gt; 
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 &amp; 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-------------------------------------------------&gt;
template &lt;class Transp&gt;
Race&lt;Transp&gt;::Race(Race &amp;K){

        return;
}
template &lt;class Transp&gt;
Race&lt;Transp&gt;::Race(char *n, double l):
        laenge(l),
        t(0),
        Tn(NULL),
        anz(0)
                        {
 		name = new char;
        name = n;
        printf(&quot;Ein Rennen mit Namen %s wird ausgeschrieben.\n&quot;,n);
}
template &lt;class Transp&gt;
Race&lt;Transp&gt;::Race():
        Tn(NULL),
        anz(0)
        {
        name = new char;
        name = &quot;noname&quot;;
        printf(&quot;Ein Rennen noch ohne Namen wird ausgeschrieben.\n&quot;);
}
template &lt;class Transp&gt;
Race&lt;Transp&gt;::~Race(){ 
        printf(&quot;Das Rennen mit Namen %s ist zu Ende.\n&quot;,name);
        delete [] Tn;
	    return; 
}

//Methoden---------------------------------------------------------------------&gt;
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::Race::anmeldung(){

	// Anmeldung der Fahrraeder:
	set_teilnehmer(&quot;Klapprad&quot;,&quot;Fahrrad&quot;,8.5);
    set_teilnehmer(&quot;Mountainbike&quot;,&quot;Fahrrad&quot;,50.5); 

    // Anmeldung der Autos:
    set_teilnehmer(&quot;Renault&quot;,&quot;Auto&quot;,700.50,10000.50); 
	set_teilnehmer(&quot;Audi&quot;,&quot;Auto&quot;,300.50,20000.50); 
	set_teilnehmer(&quot;BMW&quot;,&quot;Auto&quot;,400.50,30000.00);

	/*// Anmeldung ... : 
	set_teilnehmer(&quot;Osterhase&quot;,&quot;Tier&quot;,2.85);*/
}
template &lt;class Transp&gt;
// motorisierte Teilnhmer:
void Race&lt;Transp&gt;::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 &quot;Auto&quot; ist,
    // wird ein Auto-Objekt erstellt
    if(strcmp(cat,&quot;Auto&quot;)==0){
       Motor = new Auto;
    }
    // Wenn die Kategorie &quot;Motorrad&quot; ist,
    // wird ein Motorrad-Objekt erstellt
    else if(strcmp(cat,&quot;Motorrad&quot;)==0){
       Motor = new Motorrad;
    }
    else if(strcmp(cat,&quot;Kutsche&quot;)==0){
       NMotor = new Kutsche;
    }
    else if(strcmp(cat,&quot;Fahrrad&quot;)==0){
       NMotor = new Fahrrad;
    }
 // Wenn die Kategorie nicht definierbar ist,
 // wird eine Meldung ausgegeben
    else{
       printf(&quot;%s kommt erst naechste Woche. Es liegt eine ungueltige Anmeldung vor.\n&quot;,n);
    }

 // Den Objekten werden trotz der Bedingungen
 // ihre entsprechenden Parameter übergeben
 // (Dank virtuellen Klassen und Zeiger auf Zeiger)
    if(strcmp(cat,&quot;Auto&quot;) == 0 || strcmp(cat,&quot;Motorrad&quot;) == 0){
      Tn[anz] = Motor;
      Tn[anz]-&gt;set_name(n);
      Tn[anz]-&gt;set_vmax(v);
      Tn[anz]-&gt;set_a(a);
      Tn[anz]-&gt;set_x(0);
      anz++;
    }
    return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::spielfeld()
{
	 printf(&quot; \n&quot;);
	 printf(&quot;Titel des Rennens: %s, Dauer: %f Stunden \n&quot;,name,t);
	 printf(&quot;\n&quot;);

	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&lt;anz;i++){
		  printf(&quot;  |---------=---------=---------=---------=---------=---------=---------|\n&quot;);
		  ns = (int)(Tn[i]-&gt;put_x()/del_laenge);
		  printf(&quot;%i |&quot;,i+1);
		  for (j=0;j&lt;ns ;j++ ){
			printf(&quot;%c&quot;,'&gt;');
		  }
		  for ( j=0;j&lt;anz_striche-ns &amp;&amp; ns&lt;anz_striche ;j++ ) {
			printf(&quot;%c&quot;,' ');
		  }
		  printf(&quot;| %s\n&quot;,Tn[i]-&gt;put_name());
	} // Ende Auflisten der Fahrzeuge

    printf(&quot;  |---------=---------=---------=---------=---------=---------=---------|\n&quot;);
	printf(&quot; \n&quot;);

	fflush(stdout);

	return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::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&lt;anz;i++)
        {
         if(Tn[i]-&gt;put_x() &gt;= xmax)
         {
	  imax = i;
	  xmax = Tn[i]-&gt;put_x();
         }
	}

	// Endgueltiger Sieger:
        printf(&quot;Der Sieger ist das Fahrzeug mit dem Namen %s !\n&quot;,Tn[imax]-&gt;put_name());

	printf(&quot;\n&quot;);

	return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::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 &amp;&amp; anz&gt;0){
		t = t+del_t;
		// Autos fahren:
 		for ( i=0;i&lt;anz;i++ ){
			Tn[i]-&gt;calc_x(t);
                        //Tn[i]-&gt;calc_x(t, Tn[i]-&gt;put_x(), t-del_t);
			zielerreicht = zielerreicht || (Tn[i]-&gt;put_x()&gt;=laenge);
		} // Ende for
	}// Ende while

	spielfeld();

	return;
}
template &lt;class Transp&gt;
void Race&lt;Transp&gt;::rennende()
{
	delete [] Tn;
	return; 
}
</code></pre>
<p>Es soll ein Objekt des Klassentemplates in der main erzeugt werden. Dies will mein Compiler aber nicht und meldet diese Fehlermeldung:</p>
<pre><code class="language-cpp">`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
</code></pre>
<p>Ich arbeite zum ersten mal mit Templates und weiß deshalb nichts mit der Fehlermeldung anzufangen. In meinem Buch wurde es auch so angegeben.<br />
Hat vielleicht jemand einen Lösungsvorschlag?<br />
Danke schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299515</guid><dc:creator><![CDATA[cplusplusdep]]></dc:creator><pubDate>Tue, 05 Jun 2007 18:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate-kann Objekt nicht erzeugen on Tue, 05 Jun 2007 18:55:04 GMT]]></title><description><![CDATA[<p>Hi, das ist zuviel Code, um das es sich einer anschauen würde.<br />
Poste mal lieber auch die Stelle in main(), wo das Template instanziert wird und wo und in welcher Zeile, welcher Fehler kommt ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299537</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 05 Jun 2007 18:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate-kann Objekt nicht erzeugen on Tue, 05 Jun 2007 19:14:57 GMT]]></title><description><![CDATA[<p>Und pack die decleration und definition in die Header-Datei (bei Templates) ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299546</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 05 Jun 2007 19:14:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klassentemplate-kann Objekt nicht erzeugen on Tue, 05 Jun 2007 21:11:51 GMT]]></title><description><![CDATA[<p>Danke für die Antworten, ich hab das Problem allerdings schon gelöst. Ich hab sowas gehabt in der main</p>
<pre><code class="language-cpp">Race&lt;Transp&gt; T;
</code></pre>
<p>und es muss so sein.</p>
<pre><code class="language-cpp">Race&lt;Auto&gt; T;
</code></pre>
<p>Hatte das mit den Parametern in den Templates nicht geschnallt, aber jetzt ist mir ein Licht aufgegangen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1299633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1299633</guid><dc:creator><![CDATA[cplusplusdep]]></dc:creator><pubDate>Tue, 05 Jun 2007 21:11:51 GMT</pubDate></item></channel></rss>