www.mikrocontroller.net

Forum: Compiler & IDEs C++ & Templates


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgendes Problem:

Ich habe eine Klasse für Baumknoten deren Key ich variabel halten 
möchte:

template<class TKey> class MyCNode
{
    ...
}

Ein Anwender kann diese Klasse als Basisklasse für seine Daten 
verwenden.

Der Baum sieht nun wie folgt aus:

template<template<class TKey>class MyCNode> class MyCTree
{
    ...
}

Wenn ich jetzt in der Klasse eine Methode deklariere, so kennt er laut 
Meldung TKey nicht:

int insertNode(MyCNode<TKey>* const pNode);

Wie würdet ihr das Interface der Baumklasse gestalten, um zu erzwingen, 
dass nur von MyCNode abgeleitete Klassen als Templateargument akzeptiert 
werden?


Gruß,
Alex

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal so:

   template<class MyCNode> class MyCTree
   {
       ...
   }

MyNode kann ja alles mögliche sein, was will der Compiler erst man 
garnicht wissen.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will aber nicht sagen:

Hier ist eine Baumklasse die irgendeinen Template-Parameter hat.

Sondern:

Hier ist eine Baumklasse, die als Template-Parameter den Typen MyCNode 
(oder eine davon abgeleitete Klasse) mit dem Template-Parameter TKey 
hat.

Autor: Ingo Elsen (ogni42)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
template<class TKey> class Node
{
    ...
};

class Tree
{
public:
   void addNode(Node& newNode);
};

Mehr ist eigentlich nicht nötig. Tree braucht keinen Templateparameter

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz so einfach ists leider nicht :-)
class Tree
{
public:
   void getNode(TKey Key, Node& existingNode);
};

Da brauchts TKey dann doch.

Gruß,
Alex

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
template<class TKey> class MyCNode
{
public:
    typedef TKey KeyType;
}

template<typename Node>
class Tree
{
public:
   void getNode(Node::KeyType Key, Node& existingNode);
};

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rolf, das liegt wohl dem was ich erreichen will am nächsten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.