Как переопределить <и> в C ++ / CLI? - PullRequest
1 голос
/ 15 июня 2009

Я портирую класс, который реализует IEquatable<T> и IComparable<T> и переопределяет ==, !=, < и > из C # в C ++ / CLI. Пока что у меня есть:

Заголовок:

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);

Исходный файл:

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
}

Я не уверен, почему оригинал проверил равенство в интерфейсе и сравнил вещи в операторе, но я пытаюсь сохранить оригинальную структуру.

В любом случае, я получаю ошибку компиляции в отмеченной строке: "error C2679: binary '>' : no operator found which takes a right-hand operand of type 'ThingNamespace::Thing' (or there is no acceptable conversion)" и соответствующую ошибку двумя строками ниже. Почему он не улавливает существование перегруженного оператора?

Ответы [ 3 ]

7 голосов
/ 15 июня 2009

this - указатель, вам нужно разыменовать его.

if ((*this) > other)
    return 1;
else if ((*this) < other)
    return -1;
else
    return 0;
1 голос
/ 15 июня 2009
return (*this) == other ? 0 : ((*this) > other ? 1 : -1);
0 голосов
/ 15 июня 2009

Как сказал Арул, вам нужно разыменовать ключевое слово this, но, на заметку, вам, вероятно, следует использовать ссылки const в параметрах вашей функции вместо передачи объекта, поскольку:

-C ++ передает все объекты по значению, а не по ссылке (что и происходит в C #), поэтому использование ссылок уменьшает накладные расходы.

-Он позволит вам использовать функции из стандартной библиотеки, такие как std :: sort, без необходимости явно указывать новый оператор сравнения

...