1

私は新しいC++プログラマーです。少し前に、JavaとANSI Cを学び、試してみることにしました。

ええと、私はC ++が大好きですが、イテレーターがどのように機能するかが気に入らなかったのです。

Javaでは、コンテナ全体をプライベートにして、そのイテレータにgetter関数を実装できます。イテレータにhasNext()は、コンテナの最後に到達したかどうかに応じてブール値を返すメソッドがあります。

C ++で同様のことを行う唯一の方法は、2つのゲッターを作成することです。これにより、最初iteratorBegin()iteratorEnd()最後の位置に対応するインターレーターが返され、返されたイテレーターがインクリメントされてiteratorBegin()、と比較さiteratorEnd()れ、最後までコンテナーを反復処理できるようになりました。位置に達していた

しかし、ゲッターメソッドを1つだけ使用したいので、「独自のイテレータークラスを作成しましょう」と考えました。

これまでのところ、セットとリストでうまくいきましたが、マップではうまくいかないようです。これが私を悩ませているコードです:(クラスは別の.hで定義されており、これはcustomIteratorと呼ばれます.cpp)

template<typename T, typename D>
const D& custIterator<T,D>::next()
{
    const D& obj = (*it);
    if(hasNext())
    {
        it++;
    }
    return obj;
}

//the above works fine

template<typename T, typename D>
const D& custIterator<map<T,D>,D>::next() //error in this line
{
    D& obj = (*it).second; 
    if(hasNext())
    {
        it++;
    }
    return obj;
}

#include <map>特殊なメソッドをコンパイルすると、次のように表示されます。エラー:ファイルの上に追加したにもかかわらず、このスコープで「マップ」が宣言されていません

コードブロック付きのgccバージョン4.4.5(Debian 4.4.5-8)を使用しています

どうか、助けが必要です。

ご清聴ありがとうございました!

4

1 に答える 1

5

すべての標準コンテナは名前空間std内にあるため、このように修飾する必要があります

std::map<T,D>

#define BEGIN {一般に、JavaイディオムをC ++に引き継ぐことはお勧めしません。各言語には独自のイディオムがあり、それらを混在させると他のプログラマーが混乱するからです(これが今までで最高のアイデアではないと思うのと同じ です)。

あなたがやろうとしていることは範囲として知られており、C ++イテレータよりも優れたソリューションであると考える人もいますが、それが言語に組み込まれるまで、各開発者が独自の範囲を発明することは有害だと思います。

さらに読むか、またはtl; drスライド(これに対応するビデオがありますが、現時点では見つかりません)。

于 2012-02-28T14:41:18.763 に答える