2011-10-23 6 views
0

J'ai la suivante (tronquée) déclaration de classe:Déréférencer une erreur de pointeur de membre: ne peut pas être utilisé comme pointeur de membre

template <typename T> 
class btree 
{ 
    public: 

     btree(const btree<T>& original); //This is btree's copy constructor 

    private: 

     struct btree_node 
     { 
      btree_node(const btree_node &other) 
      { 
       //This is node's copy constructor 
      } 
     } 

     btree_node* headNode; 
} 

Et le constructeur de copie de btree est mis en œuvre ainsi:

template <typename T> 
btree<T>::btree(const btree<T>& original) 
{ 
    headNode = new btree_node(original.*headNode); 
} 

original. * HeadNode est censé retourner btree_node que pointe original.headNode, correspondant ainsi aux arguments constructeurs de copie de btree_node.

Cependant je reçois l'erreur suivante:

error: '((btree*)this)->btree::headNode' cannot be used as a member pointer, since it is of type 'btree::btree_node*'

Qu'est-ce que je fais mal?

Répondre

3

Si vous regardez le precedence table vous verrez que d'abord l'opérateur . est évalué, puis le * (déréférencer) l'opérateur est évalué.

* prend un pointeur comme argument. Si vous écrivez original.*headNode, c'est inutile. D'une certaine façon, vous lui dites d'obtenir le membre *headNode de original, mais *headNode n'est pas un membre de original. Vous lui dites également d'évaluer *headNode qui est en fait *this->headNode (notez que -> est évalué en premier).

Ce que vous voulez, c'est d'abord obtenir le pointeur en écrivant original.headNode, puis déréférencer en utilisant *. Par conséquent

*original.headNode 
+0

Merci beaucoup pour cela, je comprends maintenant :) – Arvin

5

Essayez ceci:

headNode = new btree_node(*(original.headNode)) 
+0

Ah .. bien sûr, merci, cela fonctionne – Arvin

2

Je suppose que ce que vous voulez est en fait

headNode = new btree_node(*original.headNode); 
+0

Oui c'est effectivement ce que je voulais! Erreur stupide. Merci! Je pensais que si je faisais * original.headNode alors il déréférencerait l'original qui n'est pas un pointeur et n'aurait donc aucun sens – Arvin

Questions connexes