héritage multiple, surcharge de fonction avec même nom - C++ - Programmation
Marsh Posté le 24-01-2009 à 18:41:09
Et c'est quoi ta question ? Tu t'attends à ce qu'il se passe quoi ?
Marsh Posté le 24-01-2009 à 18:48:54
Qu'il réussisse à appeler la fonction f en fonction du type d'argument passé
Je voudrais savoir comment modifier le code, pour que le compilo sache quelle fonction appeler
Marsh Posté le 24-01-2009 à 19:24:27
sauf que double et float sont covnertible l'un vers l'autre donc pour lui, en suivant la One Conversion Rule, il peut prendre les deux.
Marsh Posté le 24-01-2009 à 19:39:46
mais avec char et float c'est pareil aussi
Marsh Posté le 24-01-2009 à 20:04:18
Code :
|
Le choix de la fonction à appeler se fait en trois temps. Premièrement, la determination d'une portée ou trouver la fonction, deuxièmement résolution de la surcharge, troisièmement, contrôle d'accès.
Ici, l'ambiguïté est dans la première étape. Pour la résoudre, j'importe les noms dans la classe A donc il n'y a plus d'ambiguité de portée -- et la résolution de surcharge fonctionne comme on s'y attends. Mais donne une erreur puisque les fonctions ne sont pas accessible -- donc j'ai ajouté le public.
C'est un effet de la même règle, mais un peu plus subtil, qui empèche le code suivant de compiler
Code :
|
Marsh Posté le 24-01-2009 à 20:12:05
Joel F a écrit : sauf que double et float sont covnertible l'un vers l'autre donc pour lui, en suivant la One Conversion Rule, il peut prendre les deux. |
Il y a une voie sans conversion du tout, elle devrait être préférée. Mais la résolution de surcharge ne considère les
fonctions que dans une portée, et ici il y a ambiguité sur la portée à considérer. Ma solution consiste à introduire
une portée où les deux fonctions sont présentes.
Un appel b.f() -- où la résolution de surcharge n'est pas possible -- devrait donner la même erreur.
Marsh Posté le 24-01-2009 à 20:13:03
bienvu merci et il faut mettre les using en public aussi dans A
Marsh Posté le 25-01-2009 à 18:05:09
punaise ça craint, on peut pas faire du using avec de la génération de code automatique et les type lists. c'est à dire construire une hiérarchie de classe en métaprog, et avoir dans la classe la plus dérivée, les directives using permettant d'utiliser les différentes méthodes de même nom (les utiliser avec un objet de type "classe la plus dérivée" ), se situant dans les différents niveaux de la hierarchie ?
Marsh Posté le 26-01-2009 à 09:06:57
ReplyMarsh Posté le 26-01-2009 à 09:53:07
frenchtoucco a écrit : punaise ça craint, on peut pas faire du using avec de la génération de code automatique et les type lists. c'est à dire construire une hiérarchie de classe en métaprog, et avoir dans la classe la plus dérivée, les directives using permettant d'utiliser les différentes méthodes de même nom (les utiliser avec un objet de type "classe la plus dérivée" ), se situant dans les différents niveaux de la hierarchie ? |
Si j'ai bien compris, c'est possible (la qualification de portee d'un nom importe par une using-declaration peut etre un parametre template) mais les contraintes sont telles que ce ne doit pas etre utilisable. Pour deux raisons:
- les using-declarations ont besoin de connaitre le nom (on ne peut pas tout importer avec, ce n'est pas des using-directives et on ne peut pas importer un nom donne par un parametre template)
- on ne peut pas mettre dans une using-declaration un nom non present dans la portee dont on importe.
Joel F a écrit : à voir avec inherit_linearly de MPL ou les variantes de Alexandrescu |
Ca enleve l'ambiguite due a la determination de portee. Mais les fonctions trouvees dans la portee privilegiee vont masquer les autres, menant au probleme de mon deuxieme exemple.
Marsh Posté le 26-01-2009 à 14:27:42
Un Programmeur a écrit : |
voilà le problème est là, c'est que les noms (nom de la classe+paramètre template associé) sont connus au fur et à mesure des appels récursfis. Et comme les directives using ne peuvent pas être mis en place à l'éxécution via l'appel à une fonction "init" ,( i.e: ça fait parti de la définition de la classe.) c'est un peu l'impasse
Marsh Posté le 26-01-2009 à 15:04:20
utilise un coup de BOOST_PP magic au lieu de faire de la meta-prog par type sinon.
Marsh Posté le 27-01-2009 à 00:46:45
ok je vais regarder de ce côté là
Marsh Posté le 24-01-2009 à 18:39:02
Salut,
IL y a pas possiblité de faire un code comme ça ? Le compilo me marque error:call to f ambigu...
Merci.
Message édité par frenchtoucco le 24-01-2009 à 18:43:16
---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.