2009-06-15 5 views
1

Je suis le portage d'une classe qui implémente IEquatable<T> et IComparable<T> et remplace ==, !=, < et > de C# en C++/CLI. Jusqu'à présent, j'ai:Comment remplacer < and > en C++/CLI?

tête:

virtual bool Equals(Thing other); 
virtual int CompareTo(Thing other); 

static bool operator == (Thing tc1, Thing tc2); 
static bool operator != (Thing tc1, Thing tc2); 
static bool operator > (Thing tc1, Thing tc2); 
static bool operator < (Thing tc1, Thing tc2); 

Fichier source:

bool Thing ::Equals(Thing other) 
{ 
    // tests equality here 
} 

int Thing ::CompareTo(Thing other) 
{ 
    if (this > other) // Error here 
     return 1; 
    else if (this < other) 
     return -1; 
    else 
     return 0; 
} 

bool Thing ::operator == (Thing t1, Thing t2) 
{ 
    return tc1.Equals(tc2); 
} 

bool Thing ::operator != (Thing t1, Thing t2) 
{ 
    return !tc1.Equals(tc2); 
} 

bool Thing::operator > (Thing t1, Thing t2) 
{ 
    // test for greater than 
} 

bool Thing::operator < (Thing t1, Thing t2) 
{ 
    // test for less than 
} 

Je ne sais pas pourquoi l'égalité testé d'origine dans l'interface et les choses par rapport à l'opérateur, mais je Essaie de préserver la structure originale.

De toute façon, j'obtiens une erreur de compilation à la ligne marquée: "error C2679: binary '>' : no operator found which takes a right-hand operand of type 'ThingNamespace::Thing' (or there is no acceptable conversion)", et une erreur correspondante deux lignes ci-dessous. Pourquoi ne prend-il pas conscience de l'existence de l'opérateur surchargé?

Répondre

7

this est un pointeur, vous devrez le déréférencer.

if ((*this) > other) 
    return 1; 
else if ((*this) < other) 
    return -1; 
else 
    return 0; 
1
return (*this) == other ? 0 : ((*this) > other ? 1 : -1); 
0

comme l'a dit Arul, vous devez déréférencer le ce mot-clé, mais sur une note de côté, vous devriez probablement utiliser les références const dans votre fonction paramaters au lieu de passer l'objet depuis:

- C++ passe tous les objets par valeur, pas par référence (ce qui se passe en C#), donc l'utilisation de références réduit le temps système.

-It'll vous permettent d'utiliser les fonctions de la bibliothèque standard telles que std :: sort sans avoir besoin de spécifier explicitement un nouvel opérateur de comparaison

Questions connexes