Ce morceau de code compile et fonctionne comme prévu sur GCC 3.x et 4.x:MSVC: Union vs. classe/struct avec les opérateurs ami inline
#include <stdio.h>
typedef union buggedUnion
{
public:
// 4 var init constructor
inline buggedUnion(int _i) {
i = _i;
}
friend inline const buggedUnion operator - (int A, const buggedUnion &B) {
return buggedUnion(A - B.i);
}
friend inline const buggedUnion operator - (const buggedUnion &A, const buggedUnion &B) {
return buggedUnion(A.i - B.i);
}
int i;
} buggedUnion;
int main()
{
buggedUnion first(10);
buggedUnion second(5);
buggedUnion result = 10 - (first - second);
printf("%d\n", result.i); // 0
return 0;
}
MSVC, cependant, ne compilera pas ce code , se plaignant:
main.cpp(60) : error C3767: '-': candidate function(s) not accessible
could be the friend function at 'main.cpp(41)' : '-' [may be found via argument-dependent lookup]
or the friend function at 'main.cpp(45)' : '-' [may be found via argument-dependent lookup]
main.cpp(60) : error C2676: binary '-' : 'buggedUnion' does not define this operator or a conversion to a type acceptable to the predefined operator
Lequel des compilateurs est correct? Comment cela peut-il être résolu? J'essaye de réaliser le code propre (aucun dehors des méthodes d'ami) tout en maintenant la portabilité, la flexibilité et le code auto-documentant.
Quelques notes:
- Ceci est un test cas pour montrer le problème, le type de données d'origine est beaucoup plus sophistiqué et soigneusement conçu, mais ne fonctionne pas dans MSVC (compilateur principal est GCC, bien que la compatibilité MSVC soit également souhaitée). L'ajout de 'public:' au début de la déclaration d'union ne le résout pas.
- Ajout « public: » avant chaque opérateur ne résout pas
- Conversion du cas de test à une struct/classe ne fixe, mais ce n'est pas souhaitée (S'il vous plaît pas de flammes, je me suis raisons La plupart d'entre eux. sont les limites du langage C++)
- méthode de l'opérateur doit être laissé à l'portée mondiale (et non une fonction membre)
solution optimale ne se baserait pas sur le déplacement de la déclaration en dehors de la définition du syndicat pour des raisons d'esthétique (plus de 24 combinaisons différentes d'opérateurs et d'opérateurs ands), mais cela sera fait s'il n'y a pas d'autre solution.
Votre code peut compiler et s'exécuter correctement sur gcc (GCC) 3.4.4 en utilisant cygwin 32 bits de Win 7. –