Erreur d'accès ambigu à une fonction membre après dérivation multiple

Erreur d'accès ambigu à une fonction membre après dérivation multiple - C++ - Programmation

Marsh Posté le 29-03-2007 à 22:51:41    

Salut à tous.
 
Soit le code suivant:
 

Code :
  1. struct A
  2. {
  3.       void x(int i)
  4.       {
  5.             printf("\nIn A::x" );
  6.       }
  7. };
  8. struct B
  9. {
  10.       void x(char c)
  11.       {
  12.             printf("\nIn B::x" );
  13.       }
  14. };
  15. struct C : A, B
  16. {
  17. // uncomment the following two lines to resolve this C2385
  18. // using B::x;
  19. // using A::x;
  20. };
  21. int main()
  22. {
  23. C toto;
  24. toto.x(100); // ==> Génère une erreur
  25. toto.x('c'); // ==> Génère une erreur
  26. }


 
La question est simple: VC++ génère une erreur à la compilation car il ne semble pas etre capable de déterminer quelle fonction x il doit exécuter; mon soucis est que la signature des fonctions n'est pas la même puisque dans un casla fonction x parend comme argument un char et dans l'autre c'est un int. Si c'était simplement de la surcharge de fonction ça marcherait sans aucun problème il me semble.
Serait-ce possible que ce soit un probleme de scope puisque l'utilisation des using permet de faire sauter cette ambiguité.
Quelqu'un peut-il m'en dire un peu plus sur le sujet? Sa'git-il d'un comportement que l'on retrouve sur d'autre compilateurs ou est-ce une particularité de VC++?
 
Merci par avance pour vos réflexions sur le sujet.


Message édité par papangue le 29-03-2007 à 22:52:23
Reply

Marsh Posté le 29-03-2007 à 22:51:41   

Reply

Marsh Posté le 29-03-2007 à 23:53:12    

Citation :

Serait-ce possible que ce soit un probleme de scope puisque l'utilisation des using permet de faire sauter cette ambiguité.


si au réultat du "name lookup", il y a des noms identiques ne provenant pas de la même base, il y a alors ambiguité et le programme n'est pas valide.

 
Citation :

S'agit-il d'un comportement que l'on retrouve sur d'autre compilateurs ou est-ce une particularité de VC++?


VC++ applique ce que le standard dicte, et les autres compilateurs doivent faire de même.

 

Message cité 1 fois
Message édité par ++fab le 30-03-2007 à 00:19:18
Reply

Marsh Posté le 30-03-2007 à 09:52:06    

++fab a écrit :

Citation :

Serait-ce possible que ce soit un probleme de scope puisque l'utilisation des using permet de faire sauter cette ambiguité.

 
si au réultat du "name lookup", il y a des noms identiques ne provenant pas de la même base, il y a alors ambiguité et le programme n'est pas valide.
 

Citation :

S'agit-il d'un comportement que l'on retrouve sur d'autre compilateurs ou est-ce une particularité de VC++?


VC++ applique ce que le standard dicte, et les autres compilateurs doivent faire de même.


 
Sauf que la signature n'est pas la même:
dans un cas on a une fonction de type x(int) et dans l'autre c'est du x(char).
Donc pour moi l'ambiguité devrait être automatiquement levée - c'est la cas lors de la surcharge d'une fonction il me semble.

Reply

Marsh Posté le 30-03-2007 à 10:55:05    

papangue a écrit :

Sauf que la signature n'est pas la même:
dans un cas on a une fonction de type x(int) et dans l'autre c'est du x(char).


Cela n'a pas d'importance, seul le nom compte.
 

Citation :

Donc pour moi l'ambiguité devrait être automatiquement levée

 
Non. Imagine une classe héritant de A et de B, A provenant du vendeur EntrepriseA et B provenant de EntrepriseB.
EntrepriseA et EntrepriseB ne se connaisse pas. A chaque mise à jour des bibliothèques, tu peux imaginer les problèmes qui se poserait si C++ ne procédait pas ainsi ...

Reply

Marsh Posté le 30-03-2007 à 20:13:37    

en effet de ce point de vu c'est compréhensible

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed