2011-11-04 2 views
0

Это сообщение о перегрузке оператора сообщения.Сообщение об инкрементах при перегрузке оператора в C++

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: error: prototype for ‘loc loc::operator++(int)’ does not match any in class ‘loc’ opover.cpp:49:5: error: candidate is: loc loc::operator++() opover.cpp: In function ‘int main()’: opover.cpp:69:4: error: no ‘operator++(int)’ declared for postfix ‘++’

+0

Вы не можете показать объявление класса – sehe

+2

Покажите нам свою декларацию класса? is 'loc :: operator ++ (int x)' объявлен в opover.h? –

ответ

1

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

Ваш класс должен выглядеть следующим образом:

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

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

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

+0

не совсем верно. он не декларировал правильную подпись, хотя – sehe

+0

Хехе искусство чтения сообщений об ошибках :) – sehe

+0

да, получил это :)) – littleadv

3

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

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

в

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

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

+3

Почему мы должны иметь параметр в 'operator ++' функции? Это унарная операция. Нам не нужно ничего пропускать внутри. –

+0

@VitalyDyatlov: Я не думаю, что нам нужно. Вы должны спросить OP, чего он хочет достичь. Несмотря на это, прототипы должны совпадать, и я не думаю, что спецификации C++ запрещают список параметров. Просто не будет очень полезный способ вызвать оператор, кроме как вызывать 'obj.operator ++ (42)'. Исправление моей рекомендации, хотя, поскольку вы правы, это пахнет ошибкой – sehe

+3

@VitalyDyatlov. Параметр должен различать приращение постобработки и префикса. –

2

вы должны иметь две версии ++:

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); 
Смежные вопросы