2011-12-22 17 views
2

以下の汎用関数ではいくつかの問題があります。この関数は2つの反復子と1つの値を取ります。この関数は、2つのイテレータ間を反復し、値の出現をチェックし、出現を数えます。これは、試験問題の一部だ汎用関数の呼び出しに一致する関数がありません

no matching function for call to 'count_c(int, std::vector::iterator, std::vector::iterator)'

template<typename Container> 
int count_c(Container i, typename Container::iterator &start, typename Container::iterator &end){ 
    typedef typename Container::iterator Iter; 
    int count; 
    for(Iter p = start; p != end; p++){ 
     if((*p) == i){ 
     count = count + 1; 
    } 
    return count; 
} 


int main(){ 
    vector<double> myv; 
    myv.push_back(9); 
    myv.push_back(10); 
    count_c(9, myv.begin(), myv.end()); 
    return 0; 
} 

Write a generic function count which:

  • Takes as parameters a value and two iterators of a container (where to start from and where to finish in the container).

  • It uses the iterators to go through the elements of the container and count the occur- rences of the value in the container.

  • Finally, it returns the number of occurrences of the value it has found.

2回の反復子が必ずしもコン tainerの開始によって返されるものと同じではありませんが、私は次のエラーを取得します()およびend()メソッドを使用します。

答えて

2

1)イテレータを参照渡ししないでください。

なぜですか?右辺値式への参照はバインドできないため、begin()end()があります。また、反復子は非常に小さく、値でコピーするのが速いので、それほど重要なポイントはありません。

2)コンテナではなくイテレータタイプを使用します。

9はコンテナではないため、イテレータタイプはありません。イテレータはコンテナがなくても動作するように設計されているため、コンテナが必要な理由はありません。いくつかのイテレータには、普通のポインタのようなコンテナはありません。イテレータのタイプを指定する場合は、常に関数をcount_c<foo::iterator>(...)と呼び出すことができます。

template<typename iter_t> 
int count_c(int i, iter_t start, iter_t end){ 
    int count = 0; 
    for(iter_t p = start; p != end; p++){ 
     if((*p) == i){ 
     count = count + 1; 
    } 
} 
+1

これは[タグ:宿題]です! :( – Xeo

+0

'count'を初期化することを忘れないでください! – Johnsyweb

4

まず、あなたは9を渡す(タイプintである)、それはContainerは次のように推測する内容です。 intにはネストされたtypedefがありませんiteratorSFINAEこれは、オーバーロードセットから関数を削除します。選択できる他の関数がないため、関数を呼び出すことができません。

これは試験準備用ですので、コンテナの種類ではなく、イテレータと値の種類についてのテンプレート化をお願いします。

+0

ヒントのおかげで、もう1つの質問。 myv.begin()、myv.end()をパラメータとして渡しています。しかし、イテレータをベクター内のどの要素にも向けるにはどうすればよいですか? – cody

+0

@cody:特定のインデックスを指すようにしたい場合は、これを行います: 'iterator it_at_index = myv.begin()+ index;'。 – Xeo