2

ノードから双方向リンク リストを作成しました。私はSTLで作業しています。関数でエラーが発生していoperator++ます。これが私のIterator<T>クラスです。

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

}

エラーと警告

F:\New folder\C++\Lab14\Iterator.h||'class Iterator' のインスタンス化:|

F:\New folder\C++\Lab14\main.cpp|15|ここから必須|

F:\New folder\C++\Lab14\Iterator.h|29|エラー: postfix 'void Iterator::operator++ (Iterator) [with T = int]' は引数として 'int' を取る必要があります|

F:\New folder\C++\Lab14\main.cpp||関数 'int main()' 内:|

F:\New folder\C++\Lab14\main.cpp|19|エラー: 'operator++(int)' が接尾辞 '++' に対して宣言されていません [-fpermissive]|

ちなみに、他の事業者も同様に行う予定です。はoperator*乗算用ではありません。

4

3 に答える 3

4

operator++引数を 1 つ取るintか、引数をとらない必要があります。

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

1 つ目は postfix のオーバーロードで++、2 つ目は prefixのオーバーロードです++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です。すなわち。イテレータ operator++(int); // 後置反復子 & 演算子++(); // プレフィックス

于 2013-03-19T11:56:18.883 に答える
3

ほとんどの演算子と同様に、を定義する方法は2つありますoperator++。イテレータクラスのメンバーとして、またはフリー関数として記述できます。operator++ただし、プレフィックスとポストフィックスの2つの形式があるため、別の問題があります。したがって、その演算子を書くにはもう少し考えが必要です。

メンバーとして:

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

無料の機能として:

struct Iterator { };
Iterator& operator++(Iterator&);     // prefix
Iterator operator++(Iterator&, int); // postfix
于 2013-03-19T12:04:36.180 に答える
0

operator++議論をしてはいけません。プロトタイプと定義の両方から引数を削除すると、エラーが修正されます。

そして、ちょっとした「ポインターnode<T>」のように (わかりますか?)、間接参照演算子はおそらくではなくを返すはずTです。(両方を行うことができますが、前者の方が理にかなっていて、stdコンテナーと同様に動作します。)

于 2013-03-19T11:57:40.340 に答える