2010-11-17 2 views
2

J'ai ce qui suit lors de la construction d'un graphique.erreur C2679: binaire '=': aucun opérateur trouvé qui prend un opérande de droite de type 'std :: vector <_Ty> *' (ou il n'y a pas de conversion acceptable)

#include <vector> 
using namespace std; 

template<class T> 
class Node 
{ 
private: 
    T data; 
    Node<T> *link; 
    vector<T> neighbors; 
public: 
    Node(){neighbors = new vector<T>();}; 
}; 

int main() 
{ 
    Node<int> n; 
    return 0; 
} 

... qui renvoie le C2679 d'erreur: binaire '=': aucun opérateur trouvé ...

J'utilise VS2010. Qu'est-ce qui ne va pas? Merci!

Répondre

7

L'opérateur new retourne un type de pointeur , mais votre variable membre neighbors n'est pas un pointeur. Vous affectez donc un pointeur (le résultat de new) à un type sans pointeur. Votre variable neighbors doit être un pointeur: vector<T>* neighbors.

Mais je pense que vous avez probablement mal compris l'utilisation de new ici. Vous ne devriez probablement même pas utiliser un pointeur vectoriel. Retirez simplement la ligne neighbors = new vector<T>(). L'objet vectoriel sera automatiquement initialisé et prêt à l'emploi.

En C++, le mot-clé new alloue et initialise des objets sur le tas, qui doivent ensuite être libérés ultérieurement à l'aide de delete. Il est préférable d'éviter le mot-clé new en initialisant simplement l'objet comme une variable automatique, comme:

vector<T> neighbors;

De cette façon, vous n'avez pas à vous soucier de la gestion de la mémoire, et l'objet vectoriel sera automatiquement détruit quand il sort de la portée.

+0

Rookie error ... C'est pourquoi il est bon de s'éloigner et de prendre un café. Merci, Charles! – soulia

1
vector<T> neighbors; 
neighbors = new vector<T>(); 

voisins n'est pas un pointeur.

L'utilisation de vecteurs ne gère pas la mémoire explicitement. En fait, dans votre constructeur de noeud, les voisins sont initialisés par défaut, donc ne les initialisez pas. Votre constructeur peut ressembler à ceci:

Node(){} 

Alors vous pouvez simplement l'omettez :)

Questions connexes