mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Do 28.03.2024 16:29 Benutzername: Passwort: Auto-Login

Thema: C++: Template in Template-Funktion nutzen vom 02.05.2011


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> C++: Template in Template-Funktion nutzen
Autor Nachricht
Touny
Threadersteller

Dabei seit: 14.07.2005
Ort: Aachen
Alter: 36
Geschlecht: Männlich
Verfasst Mo 02.05.2011 16:34
Titel

C++: Template in Template-Funktion nutzen

Antworten mit Zitat Zum Seitenanfang

Hi.
Der Threadtitel ist bestimmt nicht ganz korrekt. Aber besser konnte ich es irgendwie nicht ausdrücken. Ich habe ein Template "Wald" mit einer Funktion "BlaetterZaehlen", in der ich auf das Template "Baum" zugreifen will.

Fehlermeldung bei Kompilierung (ohne Linken) von Wald.cpp:
Wald.cpp:17:24: error: expected primary-expression before ‘int’
Wald.cpp:17:24: error: expected ‘;’ before ‘int’
Wald.cpp:17:27: error: expected unqualified-id before ‘>’ token

Kurz: Er erkennt nicht, dass es sich um ein Template handelt.

Wie regel ich das am besten? Das "richtige" Programm ist etwas größer und nicht ganz so trivial. Daher wäre eine Spezifizierung für jede einzelne Eingabe-Klasse doof. Auch eine "Oberklasse", die z.B. ein virtuelles GET bereitstellt, wäre bei der Streuung der Eingabedaten nicht so ganz gut rechtfertigbar.

Code:
Code:

[b]Baum.h[/b]

class Baum
{
public:
  Baum();

  std::map<std::string,int> Liste;

  template <typename OutType>
  OutType get(const std::string pathInPT);

};

Code:

[b]Baum.cpp[/b]
#include "Baum.h"

Baum::Baum()
{
  this->Liste["Blatt"] = 42;
}

template <typename OutType>
OutType Baum::get( const std::string pathInPT)
{
  return this->Liste[pathInPT];
}

template int Baum::get( const std::string pathInPT);

Code:
[b]Wald.h[/b]

class Wald
{
public:
  Wald();

  template <class Type>
  int BlaetterZaehlen(Type derBaum);
};

Code:
[b]Wald.cpp[/b]

template <class Type>
int Wald::BlaetterZaehlen(Type derBaum)
{
  return 2*derBaum.get<int>("Blatt");
}


Vielen Dank schon mal für alle Ratschläge!
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Mo 02.05.2011 18:15
Titel

Antworten mit Zitat Zum Seitenanfang

Böh kannste mal die Zeile markieren, in der der Compiler meckert? Formal scheint das - soweit ich das mit meinen höchst mangelhaften c++-Kenntnissen erkennen kann - richtig zu sein.

Kommt mir aber dennoch ein wenig seltsam vor, jedes Argument generisch zu definieren --- ist das da überhaupt nötig?


Zuletzt bearbeitet von bacon am Mo 02.05.2011 18:16, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden
Anzeige
Anzeige
Touny
Threadersteller

Dabei seit: 14.07.2005
Ort: Aachen
Alter: 36
Geschlecht: Männlich
Verfasst Mo 02.05.2011 22:05
Titel

Re: C++: Template in Template-Funktion nutzen

Antworten mit Zitat Zum Seitenanfang

Touny hat geschrieben:

template <class Type>
int Wald::BlaetterZaehlen(Type derBaum)
{
return 2*derBaum.get<int>("Blatt");
}


Dort meckert er. Das Problem scheint halt einfach zu sein, dass er bei diesem generischen Typ kein Template-Zugriff zulässt. Ist ja auch irgendwo eine große Einschränkung, sodass diese generische Formulierung eigentlich keinen richtigen Sinn macht. Sehr viel besser wäre eine Art Oberklassen-Objekt mit virtuellen getter/setter-Methoden.
Aber nunja, wie sagt man so schön: Das Programm ist historisch gewachsen und mittlerweile stimmt die Modellierung nicht mehr so ganz mit der Programmierung überein. Das soll auch "irgendwann" grundlegend angepackt werden, dieses eigentlich keine Update soll aber jetzt noch so funktionieren. Eigentlich. Hoffentlich. *zwinker*
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Touny
Threadersteller

Dabei seit: 14.07.2005
Ort: Aachen
Alter: 36
Geschlecht: Männlich
Verfasst Mo 02.05.2011 23:43
Titel

Antworten mit Zitat Zum Seitenanfang

Edit deaktiviert, schade.

Der erste kleine Fehler ist gefunden: Alles, was in Wald.cpp steht muss eigentlich in die Wald.h rein. Laut Standard steht die Implementierung eines Templates auch in der Header-Datei.

Dies löst aber leider mein eigentliches Problem nicht. *Schnief*
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Di 03.05.2011 07:53
Titel

Antworten mit Zitat Zum Seitenanfang

Das ist aber doch eigentlich ziemlich egal, wo das implementiert wird, oder? Vor allem, weil das doch Template-*Funktionen* sind - wär doch schön, wenn die Implementierung der jeweiligen Klasse dann immerhin am gleichen Ort (nämlich in der cpp-Datei) verdrahtet wär...

Doch wie gesagt, C kenn ich nur aus der grauen Theorie heraus, ich habe keinerlei praktische Erfahrung. Frag doch mal den Qualidat, der kennt sich in sowas bestimmt besser aus.


Zuletzt bearbeitet von bacon am Di 03.05.2011 07:53, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden
Touny
Threadersteller

Dabei seit: 14.07.2005
Ort: Aachen
Alter: 36
Geschlecht: Männlich
Verfasst Di 03.05.2011 16:12
Titel

Antworten mit Zitat Zum Seitenanfang

Problem ist gelöst.

Statt
return 2*derBaum.get<int>("Blatt");

muss da hin:
return 2*derBaum.template get<int>("Blatt");

Damit der Compiler weiß, dass es sich um ein Template handelt. Lächel

Danke fürs Mitdenken.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Di 03.05.2011 18:00
Titel

Antworten mit Zitat Zum Seitenanfang

verrückte Syntax ... aber jut - muss es geben.
  View user's profile Private Nachricht senden
 
Ähnliche Themen joomla template in ein html/css template konvertieren?
Joomla Template
TYPO3 Template
typo3 Template
Billiard-Template
Was ist ein Whitepapier Template?
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.