2011-01-18 9 views
1

私は単純な問題で助けを必要とC++テンプレートとSTLのベクトルの問題

イムクラス

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

template<class T> class merge_sort 
{ 
protected: 

    vector<T> merge(const vector<T> &a, const vector<T> &b) 
    { 
     vector<T> v; 

     typename vector<T>::iterator A; 
     A= a.begin(); 
     typename vector<T>::iterator B; 
     B= b.begin(); 
... 

を作成しようとしているが、コンパイラは私に次のエラーを与える:べき

no match for ‘operator=’ in ‘A = ((const std::vector<int, std::allocator<int> >*)a)->std::vector<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator<int>]()’ merge.cpp /merge_sort line 23 C/C++ Problem 
+0

なぜ "typename"をベクトル :: iterator A; 'の前に置いていますか? –

+3

@Kiril: 'ベクトル :: iterator'は従属名なので? –

+0

そして次の行で一度だけ使用するタイプ名 'A'を持つことで何が得られますか?また、これはテンプレートクラスであり、ヘッダーに置かれるので、ヘッダーファイルには 'namespace'を使用しない宣言はこれまでにはありません。 – Mephane

答えて

7

使用

typename vector<T>::const_iterator A = a.begin(); 
typename vector<T>::const_iterator B = b.begin(); 

abbeginのconstのバージョンが呼び出されるconstの参照があり、そしてそれはconst_iterator、ないiterator返すため。ポインタにポインタをconstに割り当てることができないように、をiteratorに代入することはできません。

+0

これは何の目的ですか?両方のオブジェクトは 'const'です... – Nim

+1

@Nim' iterator'sに 'const_iterator'sを代入することはできません。これはconstへのポインタをポインタに割り当てるのと同じです。 –

+0

これは正しい答えです。 – sbi

3
typename vector<T>::iterator A; 

be

typename vector<T>::const_iterator A; 
B

の更新のための同じ

私のC++スキルが錆びていますが、

マージする渡された2つのvectorsがconstの参照があるので、あなたがそれらの上に移動するには、標準のイテレータを使用することはできません、標準イテレータではベクトルの内容を変更できるためです。したがって、const_iteratorを使用する必要があります。これは、ベクターの内容を変更することを許可しません。

私のC++ Fuがスクラッチにならない場合、私は問題を解決するのに十分なC++を覚えていますが、C++を怒らせて使用していません。 。 。ワウ7年(それは本当にそれは長いですか?バガー私は老いています)。

私が言ったように、より良い説明を提供できる場合は、この回答を編集してください。

+0

が削除されました。 :) – Nim

+1

btw - これがOPの助けになる理由の説明かもしれません... – Nim

+1

私は 'typename'は必須です(あなたが' typename'と移植性のないlaxistであるVisual Studioを使用しない限り) –

0

あなたはtypedefとdecarationを混同しています。

あなたが依存の型でのtypedefを宣言する場合は、あなたが型名キーワードを使用する必要があります:

typedef typename vector<T>::const_iterator iter 
iter A = a.begin(); 
iter B = b.begin(); 

ところで、型名であってもtypedefをせずに必要とされます。

関連する問題