2011-05-31 4 views
0

Je suis assez novice en C++, et j'ai une erreur que je ne comprends pas.Pointer confusion

class1* a = (class1*)p1; 
class2* b = (class2*)p2; 
a->foo(b); 

L'erreur est:

error: no matching function for call to 'a::foo(b*&)' 
note: candidates are: void a::foo(const b&) 

Comment puis-je obtenir ce droit?

+0

Il est évident à partir du message d'erreur que le code que vous nous avez montré n'est pas le même que celui que vous avez essayé de compiler. Dans le futur, montrez-nous votre code * réel *, pas une approximation de-mémoire. – ildjarn

+1

@ildjam: Je pense en fait que le message d'erreur est assez lié au code présenté: essayer d'appeler une méthode 'foo' de la classe' a' en utilisant comme argument une lvalue de type 'b *', qui correspond 'a -> foo (b) 'parfaitement. –

+1

@dribeas: sauf qu'entre le code réel et cette question, le type 'a' a été renommé' class1' et 'b' en' class2', puis les variables nommées d'après les anciens noms de types. –

Répondre

10

Vous avez probablement faire

a->foo(*b); 

parce que foo prend une référence à un pointeur non b à b.

What are the differences between a pointer variable and a reference variable in C++? est un bon endroit pour apprendre la différence entre un pointeur et une référence en C++

+0

Merci, cela a fonctionné –

+4

@Sticky: Comprenez-vous la différence entre les références, les pointeurs et l'adresse des objets? – Klaim

+0

Je viens de Java, donc tout est fait pour moi;) Maintenant je comprends –

4

Vous appelez une fonction qui attend une référence à un objet avec un pointeur vers ledit objet (qui est un type incompatible). Pour obtenir le code à compiler, vous voulez appeler foo comme ceci:

a->foo(*b); 

Essentiellement, vous déréférencer le pointeur pour obtenir l'objet réel et de passer à celui foo. Le compilateur prend soin de transmettre une référence à l'objet au lieu de l'objet lui-même.