je ne comorend pas trop ou tu veux en venir; j'ai arrete ma position ici:
tu as des unites de compilation qui voient un header different, avec du code different, mais avec la meme signature.
Je dis que dans ce cas la, le linker est libre de choisir la version qui lui plait. Il y a deux cas ou c'est autorisé: les fonctions inline )qui seront surement en plusieurs exemplaires dans les fichiers sources, puisque copiees au besoin) et les fonctions templates (comme les fonctions inline, elles sont instanciees sur demande, donc il se peut qu'elles soient dans deux unites de compilation separees). Sinon, il ne doit y avoir qu'une seule definition de la methode pour toutes les unites de compilation.
donc je te dis que dans ce cas (inline ou template) le linker est susceptible de choisir nimporte quelle version, surtout la mauvaise. Il a le droit de choisir si il instancie les methodes comme il veut, et il a le droit de choisir la version qui lui plait, en fonction des dernieres elections legislatives ou de la position de Jupiter.
Ce que tu me décris la c'est un des problemes possibles, tu bidouilles un fichier et il utilise une autre methode dans un fichier qui n'a rien a voir, ca ne m'etonne pas puisque le linker est en droit de choisir. En modifiant un fichier, tu as pu
* changer la liste des fichiers sur la ligne de commande, du coup le linker rencontre une autre implementation en premier
* retirer une des implementations (pour certaines methodes, comme un constructeur ou un destructeur, le compilateur genere automatiquement pour chaque fois ou il voit la classe peut etre, encore une fois si ca lui fait plaisir, c'est lui qui a raison de toute facon)
* ajouter une implementation differente en appelant une methode ou ajoutant un include
c'est sensible, il n'y a pas de regle ni de garantie, il n'y a pas a expliquer pourquoi ca devrait marcher ou ca devrait pas marcher, ca depend de parametres completement inconnus. La seule possibilite c'est de compiler avec TOUJOURS la meme definition des methodes inline.
Si la solution de jabbounet ne fonctionne pas a cause de visual studio 6, je recommende ma version qui te force a definir la macro partout. ainsi si un fichier inclut le code sensible sans avoir inclu la definition de la macro, ca ne compilera pas au lieu d'inserer des methodes moisies.
Ou sinon definir ta macro au niveau du projet
Partager