2017-03-08 1 views
3

Je voulais créer une structure similaire à celle-ci:méthodes de classe imbriquées C++

template <typename W> 
class Graph { 
public: 
    struct Vertex { 
     std::vector<typename Graph<W>::Vertex> next() { 
      return GetNext((*this)); 
     } 
    }; 
    virtual std::vector<typename Graph<W>::Vertex> GetNext(Vertex v) = 0; 
}; 

(ne regardez pas les champs manquants etc.)

J'ai essayé quelque chose comme ça, mais il donne tout types d'erreurs, y compris les erreurs de syntaxe ou "impossible d'instancier" même pensé que je tente d'instancier une classe dérivée qui a GetNext surchargé. Question: est-ce que cette structure est même autorisée en C++ et comment l'implémenter correctement?

+0

intérieur 'Vertex' (et donc à l'intérieur de' 'Graph ), vous pouvez simplement utiliser' Vertex' au lieu de 'typename Graphique :: Vertex'. – Jarod42

Répondre

4

Le seul problème avec votre code est que vous appelez GetNext de Vertex mais Vertex n'a pas de fonction membre GetNext.

Si vous souhaitez appeler une méthode de Graph à partir de Vertex, vous avez besoin d'une variable Graph pour l'appeler, par ex. une variable membre:

struct Vertex { 
    Graph& graph; 

    std::vector<typename Graph<W>::Vertex> next() { 
     return graph.GetNext(*this); 
    } 
};