2010-09-28 4 views
2
fichier

en-tête est « graph.h »Besoin d'aide, je ne comprends pas pourquoi code suivant ne se compilé

#ifndef _GRAPH_H_ 
#define _GRAPH_H_ 

#include <map> 
#include <vector> 

using namespace std; 

template <class T> 
class VERTEX 
{ 
public: 
    VERTEX(T inVertex): m_vertex(inVertex), m_visited(false){} 
    ~VERTEX(){} 
private: 
    T m_vertex; 
    bool m_visited; 
}; 

template <class T> 
class GRAPH 
{ 
public: 
    GRAPH() {} 
    ~GRAPH(){} 
    typedef VERTEX<T> GRAPHVERTEX; 
    typedef vector<GRAPHVERTEX> ADJLIST; 
    typedef map<GRAPHVERTEX, ADJLIST> GRAPHMAP; 

    void insert(GRAPHVERTEX inSRC, GRAPHVERTEX inDST) 
    { 
     GRAPHMAP::iterator itr = m_graph.find(inSRC); 
    } 

private: 
    GRAPHMAP m_graph; 
}; 

#endif 

et le fichier de test est

#include "graph.h" 

int main(int argc, char**argv) 
{ 
    GRAPH<int> *G = new GRAPH<int>(); 
    G->insert(VERTEX<int>(0), VERTEX<int>(2)); 
    return 0; 
} 
+6

Quelle est l'erreur lorsque vous allez compiler? –

+0

Je ne sais pas comment coller l'erreur car il est traversant les limites – Avinash

+0

erreur C2784: 'bool std :: opérateur <(const std :: vecteur <_Ty,_Alloc> &, const std :: vecteur <_Ty,_Alloc> &)': impossible de déduire argument de modèle pour 'const std :: vector <_Ty,_Alloc> &' from 'const VERTEX ' – Avinash

Répondre

3

Il y a deux problèmes.

Vous devez d'abord qualifier le type dépendant de insert:

void insert(GRAPHVERTEX inSRC, GRAPHVERTEX inDST) 
{ 
    typename GRAPHMAP::iterator itr = m_graph.find(inSRC); 
} 

Deuxièmement, vous avez besoin d'un opérateur < pour votre classe de sommet. Dans la section publique de VERTEX ajouter ceci:

bool operator<(const VERTEX<T>& right) const { return m_vertex < right.m_vertex; } 

En note de style que dans les noms C++ MAJUSCULES sont généralement réservés aux constantes. Vertex serait un nom beaucoup plus normal pour votre classe. Notez également que le fait d'avoir using namespace dans un en-tête peut avoir de nombreux résultats indésirables et imprévisibles selon l'ordre d'inclusion et devrait être complètement évité.

EDIT: Au moins lorsque j'ai compilé ceci avec g ++, la première erreur que j'ai eu concernait GRAPHMAP :: itérateur. Lorsqu'un compilateur voit un identifiant qui pourrait être traité comme une variable ou un type, il choisit de l'interpréter comme une variable par défaut, mais découvre ensuite qu'il s'agit en fait d'un type. Vous dites au compilateur que c'est vraiment un type en utilisant le mot-clé typename.

La deuxième chose à noter est que map est un conteneur ordonné et en tant que tel, vous devez soit passer dans une fonction de comparaison ou de fournir un opérateur < la clé de la map. Puisque VERTEX est la clé de la carte, j'ai mis en place un operator< afin que les objets puissent être triés et qu'un ordre soit maintenu. Vous devrez peut-être ajuster l'opérateur de comparaison lorsque votre classe VERTEX évoluera.

+0

Merci, cela a fonctionné, Pouvez-vous s'il vous plaît également expliquer le changement de code. – Avinash

+0

RE ALLCAPS: Mais ce n'est pas un modèle juste une macro? ;) – xan

+0

Dans mon esprit, un modèle ressemble beaucoup plus à une classe normale qu'à une macro ou une constante. –

1

Vous ne pouvez pas créer une carte avec GRAPHVERTEX en tant que clé car vous devez pouvoir comparer la clé avec l'opérateur <. Vous devez donc définir cet opérateur.

0

Votre classe VERTEX est utilisée comme une clé dans la carte; il est nécessaire d'avoir un opérateur "moins" défini.

0

Pour utiliser une classe comme clé dans une carte, vous devez définir operator< pour ce type ou vous devez spécifier un comparateur lorsque vous créez la carte. En supposant que les objets de ce type ont un ordre "naturel", vous devez normalement utiliser cela pour implémenter operator<. Vous utilisez généralement un objet comparateur séparé lorsque vous devez organiser des objets d'un type donné dans un certain nombre d'ordres différents, et aucun ordre n'est vraiment plus "naturel" ou dominant que les autres (par exemple, lorsque vous travaillez avec des employés, vous pouvez regarder chez eux à peu près aussi souvent par numéro de sécurité sociale, nom et ancienneté).