Problem mit (rekursiver) Template-Definition



  • Hallo zusammen,

    ich bin auf folgendes Problem gestossen. Ich möchte einen Graphen mit Knoten und
    Kanten programmieren. Da es verschiedene Kanten-Typen und die Knoten-Typen gibt,
    soll dieser Graph ein Template sein:

    template<typename NodeType, typenmane TransitionType>
    class Graph{
    ...
    };
    

    Jetzt soll natürlich jede Kante nur diese KnotenTypen enthalten.
    Folglich würde ich hierfür ein Template für Transition machen:

    template<typename NodeType>
    class Transition{
    const NodeType& getSourceNode(){...}
    ...
    };
    

    Ich möchte natürlich auch dass der Knoten die genauen Transitionen enthält:

    template<typename TransitionType>
    class Node{
    const std::list<TransitionType>& getTransitions(){...}
    ...
    };
    

    Hier gerate ich in eine Endlosschleife, da der Knoten den Transitions-Typen braucht,
    dieser wieder den Knoten-Typ usw.

    Gibt es eine Lösung für dieses Problem? Wie würdet ihr das lösen?
    Gruß,
    CSpille


  • Mod

    Bis dahin gibt es noch kein Problem. Was gegenseitige Abhängigkeiten betrifft, schaffen Templates normalerweise keine zusätzlichen Probleme, es gilt im Wesentlichen das, was auch bei Klassen zu beachten ist: falls die Definition einer Klasse (bzw. die Instantiierung eines Klassentemplates) von einer zweiten Definition (bzw. einer weiteren Instantiierung dieses oder eines anderen Templates) abhängt, so darf diese zweite Definition nicht ihrerseits von der ersten abhängen.



  • Hallo camper,

    Der Code soweit hab birgt soweit keine Probleme,
    aber wie definier ich denn jetzt den Graphen?

    Graph<Node, Transition> graph;
    

    reicht ja nicht.

    Graph<Node<Transition>, Transition<Node> > graph;
    

    reicht ja auch nicht 😞

    Das kann ich jetzt beliebig fortführen.

    Graph<Node<Transition<Node> >, Transition<Node<Transition> > > graph;
    

    usw.

    Ich hoffe jetzt ist klar, was ich meine

    Gruß,
    CSpille



  • Was du machen könntest:

    template<typename TransitionType>
    struct Node
    {
    
    };
    
    template<template <typename> class NodeType>
    struct Transition
    {
        typedef NodeType<Transition> node_type;
    };
    
    template<typename TransitionType>
    struct Graph
    {
        typedef typename TransitionType::node_type node_type;
        typedef TransitionType transition_type;
    };
    
    int main()
    {
       Graph< Transition< Node > > graph;
    }
    


  • Hey evilissimo,

    perfekt!!!

    Ich danke dir vielmals.
    Ich glaub das hilft mir weiter.

    Gruß,
    CSpille


Anmelden zum Antworten