2013-03-19 41 views
2

我已經創建了一個雙向鏈表。我正在與STL合作。我在operator++函數中出錯。這是我的Iterator<T>班。STL和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

人,學會格式化你的代碼... – 2013-03-19 11:52:38

+3

'錯誤:postfix'void Iterator :: operator ++(Iterator)[with T = int]'必須以'int'作爲它的參數' - 你不明白哪部分錯誤信息? – 2013-03-19 11:55:24

+0

這是什麼意思,你是「與STL合作」? – jalf 2013-03-19 12:01:12

回答

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成員之前返回的對象的副本。這通常是一個後綴增量運算符。

要獲得前綴增量,不帶參數的重載。它應通過引用返回*this。即。 迭代器運算符++(int); //後綴 迭代器& operator ++(); //前綴

0

operator++不應該有參數。從原型和定義中刪除參數應該可以解決您的錯誤。

而只是作爲一個有點「指針」(明白了嗎?)時,引用操作也許應該返回node<T>,不T。 (你可以做到這兩點,但前者更有意義,並且會使其行爲與std容器類似。)

3

與大多數操作員一樣,有兩種方法可以定義operator++。你可以把它寫成迭代器類的成員,或者作爲一個自由函數。但還有另一個複雜因素,因爲有兩種形式的operator++:前綴和後綴。所以編寫這個操作符需要更多的思考。

成爲會員:

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

作爲一個自由的功能:

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