Пост-инкремент в перегрузке оператора в С++

Это мое объявление о перегрузке оператора приращения поста.

loc loc::operator++(int x)
{
    loc tmp=*this;
    longitude++;
    latitude++;
    retrun tmp;
} 

Мой конструктор класса

loc(int lg, int lt) 
{
   longitude = lg;
   latitude = lt;
}

В основной функции я закодировал, как показано ниже

int main()
{
    loc ob1(10,5);
    ob1++;
}

При компиляции этого я получаю следующую ошибку

opover.cpp:56:5: ошибка: прототип для 'loc loc::operator++(int)' не соответствует ни одному в классе 'loc' opover.cpp:49:5: ошибка: кандидат: loc loc::operator++( ) opover.cpp: В функции 'int main()': opover.cpp:69:4: ошибка: не объявлен 'operator++(int)' для постфикса '++'


person Heartly    schedule 04.11.2011    source источник
comment
Вы не можете показать объявление класса   -  person sehe    schedule 04.11.2011
comment
Покажи нам свое объявление класса? объявлено ли loc::operator++(int x) в opover.h?   -  person Tio Pepe    schedule 04.11.2011


Ответы (3)


Исправьте объявление вашего класса из

class loc
{
    // ...
    loc operator++();
} 

to

class loc
{
    // ...
    loc operator++(int);
} 

[Изменить удалены ошибочные замечания о возврате по значению. Возврат по значению — это конечно обычная семантика для постфиксного оператора++]

person sehe    schedule 04.11.2011
comment
Зачем нам параметр в функции operator++? Это унарная операция.. нам не нужно ничего передавать внутрь - person Vitaly Dyatlov; 04.11.2011
comment
@VitalyDyatlov: Я не думаю, что мы должны. Вы должны спросить ОП, чего он хочет достичь. Несмотря на это, прототипы должны совпадать, и я не думаю, что спецификации C++ запрещают список параметров. Просто не будет очень полезного способа вызвать оператор, кроме вызова obj.operator++(42). Исправляю свою рекомендацию, раз вы правы, это пахнет ошибкой. - person sehe; 04.11.2011
comment
@VitalyDyatlov параметр должен различать приращение пост- и префикса. - person AndersK; 04.11.2011
comment
Извините, я ошибся.. извините. Здесь stackoverflow.com/questions/4421706/operator-overloading объясняется перегрузка. без входных параметров у нас есть перегрузка префикса ++x, с int в качестве параметров функции у нас есть перегрузка постфикса x++, так что это просто для того, чтобы различать префикс и постфикс... извините за ошибку - person Vitaly Dyatlov; 04.11.2011
comment
@ Андерс, да, только что понял, что - person Vitaly Dyatlov; 04.11.2011
comment
Возврат копий из operator++ является обычной семантикой, если вы реализуете пост-инкремент, а не преинкремент. Вы предлагаете реализовать другой оператор с другой семантикой. - person David Rodríguez - dribeas; 04.11.2011
comment
@DavidRodríguez-dribeas и @Anders: упс. Да, меня смутило двухэтапное размышление (начав с того, что я добавил & к типу возвращаемого значения, что было моей ошибкой) Исправлено - person sehe; 04.11.2011

у вас должно быть две версии ++:

loc& loc::operator++() //prefix increment (++x)
{
    longitude++;
    latitude++;
    return *this;
} 

loc loc::operator++(int) //postfix increment (x++)
{
    loc tmp(longtitude, langtitude);
    operator++();
    return tmp;
}

И, конечно же, обе функции должны быть определены в прототипе класса:

loc& operator++();
loc operator++(int);
person Vitaly Dyatlov    schedule 04.11.2011

Вы не объявили перегруженный оператор в своем определении класса.

Ваш класс должен выглядеть примерно так:

class loc{
public:
    loc(int, int);
    loc operator++(int);
    // whatever else
}

** редактировать **

Прочитав комментарии, я заметил, что в вашем сообщении об ошибке указано, что вы объявили loc operator++(), так что просто исправьте это.

person littleadv    schedule 04.11.2011
comment
не совсем верно. он не объявил правильную подпись, хотя - person sehe; 04.11.2011