2

テンプレートタイプのイテレータのSTLオブジェクトを作成するにはどうすればよいですか?以下のようなテンプレートタイプのイテレータのSTLオブジェクト(たとえばVector)を作成しようとしています。

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

これは、g++とVC++の両方で失敗します。どちらのコンパイラもほぼ同じことを言っています

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

ノート

回答から私が理解したのは、タイプが依存している場合、キーワードの接頭辞を付ける必要があるということtypenameです。もしそうなら、

vector< vector<T>  >  it;

失敗するはずですが、失敗しません。依存typenameする名前がtypedef

4

3 に答える 3

5

typenameキーワードを追加する必要があります。

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

このページは私がそれを最も理解するのに役立ちました。

于 2012-05-01T12:04:46.147 に答える
4

次のように使用する必要がありますtypename

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

iteratorテンプレート引数に依存するため、は依存名であるためですT

補足として、ベクトルのサイズが変更されると、ベクトルのイテレータが無効になることに注意してください。したがって、そのようなイテレータのベクトルは、あなたが思うほど有用ではないかもしれません。このようなベクトルを有用なものにするために、このイテレータのベクトルに格納するイテレータのイテレータがベクトル自体のサイズを変更しないようにしてください。

于 2012-05-01T12:04:37.983 に答える
1

これはすぐに何度も尋ねられました...

 vector<typename vector<T>::iterator>

問題は、ネストされた型iteratorがテンプレートの引数に依存していることです。そのため、型であることをコンパイラに通知する必要があります。そうしないと、通常のテンプレートであると見なされます。

于 2012-05-01T12:04:52.870 に答える