2012-05-01 28 views
2

テンプレートタイプのイテレータのSTLオブジェクトを作成する方法は? 私は、これは、g ++およびVC++でどこの両方失敗しテンプレートタイプのイテレータのSTLオブジェクトを作成する方法は?

vector<vector<T>::iterator> it1; 

以下のようにテンプレートの種類のイテレータのSTLオブジェクト(例えばベクター)を作成しようとしています。両方のコンパイラあなたはそれがたとえば

のために働くコンクリートタイプのイテレータを作成している場合は、ほぼ同じこと

G ++

Main.cpp:8:49: error: type/value mismatch at argument 1 in template parameter li 
st for `template<class _T1, class _T2> struct std::pair' 
Main.cpp:8:49: error: expected a type, got `std::vector<T>::iterator' 

VC++

error C2923: 'std::vector' : 'std::vector<T>::iterator' is not a valid template type argument for parameter '_Ty' 

オフコースを語ります

vector<vector<int>::iterator> it1; 

ここでは最低限の失敗例である

#include<vector> 
#include<iterator> 
using namespace std; 
template<typename T> 
class Spam { 
public: 
    vector<vector<int>::iterator> it1; #Compiles Fine 
    vector<vector<T>::iterator> it2; #Fails 
    }; 

NOTE

タイプに依存する場合は、その後、1キーワードtypenameの前に付ける必要がある場合私は答えから理解することです。そうであれば、

vector< vector<T> > it; 

も失敗するはずですが、そうではありません。 iteratorが依存名であるので、それはテンプレートに依存することは、ある

vector<typename vector<T>::iterator> it2; 

:依存名はtypedef

+0

注記が間違っています。タイプに名前を付ける従属名は 'typename'を必要としますが、'ベクトル> 'ケースには従属名はありません。(どちらも 'vector'でも' T'でもない) – MSalters

答えて

4

ときに限りそれだけであなたにtypenameを使用する必要がtypenameキーワードを失敗し、必要としているようです引数T

サイドローブとして、ベクターのイテレーターがベクターのサイズ変更時に無効になることに注意してください。そのようなイテレータのベクトルは、あなたほど役に立ちません。かもしれないだと思います。このようなベクトルを便利にするには、このイテレータのベクトルに格納するイテレータを持つベクトルのサイズを変更しないでください。

+0

私が答えから理解したのは、ある型が従属型であれば、 'typename'というキーワードの前に接頭辞を付ける必要があるということです。それがそうならば ベクトル< vector>それ; も失敗しますが、失敗します。依存名が 'typedef'の場合は' typename'キーワードが必要です。 – Abhijit

+0

@Abhijit: 'ベクトル< vector>'は従属名ではありません。従属名は 'SomeType :: SomeName'の形式のネストされた名前です。ここで 'SomeName'は従属名です。 – Nawaz

5

あなたは型名キーワードを追加する必要があります。

vector<typename vector<T>::iterator> it2; 

Thisページは私にそれを理解することはほとんどを助けました。

+0

私が答えから理解しているのは、ある型が従属型の場合、キーワードに 'typename'の前に接頭辞を付ける必要がある場合です。それがそうならば ベクトル< vector>それ; も失敗しますが、失敗します。依存名が 'typedef'の場合には失敗し、' typename'キーワードが必要です。 – Abhijit

+0

@Abhijitあなたは途中です。それは依存する必要があるだけでなく、修飾されている必要もあり、 'ベクトル< vector 'はそうではありません。私は再び私がリンクを投稿することを推奨することができます、それは非常によくそこに説明されています。 – inf

+0

@Abhijit 'ベクトル< vector< T >>'は型以外のものではありませんが、 'ベクトル< T > :: iterator'はおそらく他のものかもしれません。後者の場合は、タイプを予期していることをコンパイラーに通知する必要があります。 –

1

これは問題では、ネストされたタイプiteratorは、テンプレートの引数に依存しているということですので、あなたはそれがタイプで、コンパイラに指示する必要があり

vector<typename vector<T>::iterator> 

...すぐに何度も頼まれましたそれ以外の場合は、それが通常のテンプレートであるとみなされます。

+0

あまりにも頻繁に聞かれることに同意します。コンパイラは本当にそれを示唆しているはずです( "ベクトル :: iterator>'? ")? – MSalters

+0

@MSalters GCC 4.6は私にとってそれをします – inf

関連する問題