2013-03-19 3 views
2

Я создал двусвязный список из узлов. Я работаю с STL. Я получаю сообщение об ошибке в функции operator++. Вот мой класс Iterator<T>.STL & Overloading in C++

#include "Node.h" 
#include <iostream> 
using namespace std; 

template<class T> class Iterator{ 
public: 
    Iterator(); 
    ~Iterator(); 
    Node<T> *node; 
    void operator++(Iterator<T> val); 
    void operator--(); 
    T operator*(); 
private: 

}; 

template<class T> 
Iterator<T>::Iterator(){ 
    node = 0; 
} 

template<class T> 
Iterator<T>::~Iterator(){ 

} 

template<class T> 
void Iterator<T>::operator++(Iterator<T> val){ 
    if(node != 0){ 
     node = node->next; 
    } 
} 

template<class T> 
void Iterator<T>::operator--(){ 
    if(node != 0) 
     node = node->prev; 
} 

template<class T> 
T Iterator<T>::operator*(){ 
    if(node == 0){ 
     cout << "Node no exists!"; 
    } 

    else{ 
     return node->value; 
    } 
} 

Я также получаю предупреждение в моей main функции.

#include <iostream> 
#include "List.h" 

using namespace std; 

int main() 
{ 

    List<int> mylist; 

    for(int i = 2; i < 10; i++){ 
     mylist.push_back(i); 
    } 

    Iterator<int> it = mylist.begin(); 

    while(it.node->next != 0){ 
     cout << it.node->value << "\n"; 
     it++; 
    } 


    mylist.pop_front(); 
    cout << mylist.front() << ", "; 
    cout << mylist.back(); 
    return 0; 

} 

ERRORS AND WARNINGS

F:\New folder\C++\Lab14\Iterator.h||In instantiation of 'class Iterator':|

F:\New folder\C++\Lab14\main.cpp|15|required from here|

F:\New folder\C++\Lab14\Iterator.h|29|error: postfix 'void Iterator::operator++ (Iterator) [with T = int]' must take 'int' as its argument|

F:\New folder\C++\Lab14\main.cpp||In function 'int main()':|

F:\New folder\C++\Lab14\main.cpp|19|error: no 'operator++(int)' declared for postfix '++' [-fpermissive]|

Кстати, я планирую сделать то же самое с другими операторами тоже. operator* не предназначен для умножения.

+1

Человек, научиться форматировать Ваш код ... –

+3

'error: postfix 'void Iterator :: operator ++ (Iterator) [with T = int]' должен принимать 'int' в качестве своего аргумента' - какую часть сообщения об ошибке вы не понимаете? –

+0

Что это значит, что вы работаете с STL? – jalf

ответ

4

operator++ должен либо принять одну int или нет аргументов:

void operator++(int); 
void operator++(); 

Первым из них является перегрузки для постфикса ++ и второй для префикса ++. Аргумент int предназначен только для обеспечения правильной перегрузки; его значение не указано.

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

void operator++(Iterator<T> val); 

Похоже, вы ждете объект, который в настоящее время увеличивается на единицу, чтобы быть передан в качестве аргумента. На самом деле объектом является объект, на который указывает this. Вы бы реализовать ваши operator++ так:

template<class T> 
Iterator<T> Iterator<T>::operator++(int) { 
    Iterator<T> copy = *this; 
    if(node != 0) { 
     node = node->next; 
    } 
    return copy; 
} 

Обратите внимание, что я также возвращенную копию объекта перед изменением его node члена. Обычно это ожидается от оператора приращения postfix.

Чтобы получить префиксное приращение, перегрузка без аргумента. Он должен вернуть *this по ссылке. то есть. Оператор итератора ++ (int); // postfix Итератор & оператор ++(); // префикс

0

operator++ не должен принимать аргумент. Удаление аргумента из прототипа и определения должно исправить вашу ошибку.

И точно так же, как маленький «указатель» (получить его?), Оператор разыменования, вероятно, должен возвращать node<T>, не T. (Вы можете сделать то и другое, но первое имеет смысл и будет вести себя так же, как и к контейнерам std.)

3

Как и большинство операторов, вы можете определить . Вы можете записать его как член класса итератора или как свободную функцию. Но есть еще одно осложнение, потому что есть две формы: operator++: префикс и постфикс. Так что писать этот оператор занимает немного больше.

В качестве члена:

struct Iterator { 
    Iterator& operator++(); // prefix 
    Iterator operator++(int); // postfix 
}; 

В качестве бесплатной функции:

struct Iterator { }; 
Iterator& operator++(Iterator&);  // prefix 
Iterator operator++(Iterator&, int); // postfix