2012-02-28 5 views
1

私は新しいC++プログラマーです。私は以前にJavaとANSI Cを学んでいました。マップを使った部分クラステンプレートの特殊化

まあ、私はC++を愛し、私はイテレータがどのように動作するか好きではありませんでした:

Javaでは、あなたは全体のコンテナをプライベートにして、それのイテレータにゲッター機能を実装することができ、そしてイテレータはメソッドを持っていますhasNext()は、コンテナの最後に達したかどうかに応じてブール値を返します。私はC++に似た何かを見つけ

唯一の方法はinterator、最初と最後の位置に対応するiteratorBegin()によって返された反復子をインクリメントし、iteratorEnd()との比較を返さ2つのゲッター、iteratorBegin()iteratorEnd()を、書いている、私を許可コンテナを反復するために最終的な位置は

に達していた。しかし、私はONE getterメソッドを使用したい、と私は思ったまで:とても良い今のところ

「のは、私自身のイテレータクラスを作ろう」、私は」それはセットとリストでうまくやったけど、マップではできないようだ。私をroubling:

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

専門的な方法をコンパイルし、それが言う(クラスが別々の.hで定義されている、これはcustomIterator.cppと呼ばれている):エラー:「マップ」このスコープ さえで宣言されていませんでした私はコードブロック

してくださいとgccのバージョン4.4.5(Debianの4.4.5-8)を使用していたファイル

の上に#include <map>を追加しましたけれども、私はいくつかの援助を必要としています。

ご協力いただきありがとうございます。

+1

あなたのインクルードマップの下でstd :: mapを使用します。または、custIterator ...のようにマップを修飾すると、このトリックを行う可能性があります。 –

答えて

5

すべての標準コンテナは名前空間std内にある、あなたは、このように一般的に

std::map<T,D> 

それを修飾する必要があります私は、各言語には独自のイディオムを持っているので、C++へのJavaイディオム上で実行しようとしているし、それらを混合しませ推薦(#define BEGIN {はこれまでにない最良のアイデアだと思うように)他のプログラマを混乱させるでしょう。

の範囲はと言われていますが、C++イテレータより優れた解決策と考えられる人もいますが、開発者が自分自身を発明することは有害だと思います範囲。

Further readingまたはtl;dr slides(私が現時点で見つけることができないビデオがあります)。

+0

+1 "各言語には独自のイディオムがあるので、JavaのイディオムをC++に持ち越そうとしていません" - 通常、イディオムは正当な理由があります。 –

+0

何か恥ずかしい間違い、ありがとう、それは働いた 今、私はコードをコンパイルする他の困難を持っているので、私はテンプレートの専門分野のマニュアルを再度読まなければならないようです。 ご協力ありがとうございます –

関連する問題