如何创建模板类型的迭代器的STL对象?

时间:2012-05-01 11:59:49

标签: c++ visual-c++ stl iterator g++

如何创建模板类型的迭代器的STL对象? 我正在尝试创建一个模板类型的迭代器的STL对象(比如Vector),如下所示

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

这在g ++和VC ++中都失败了。两个编译器几乎都说同样的事情

克++

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个关键字

3 个答案:

答案 0 :(得分:5)

您必须添加typename关键字:

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

This页面让我了解最多。

答案 1 :(得分:4)

您需要将typename用作:

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

这是因为iterator是一个依赖名称,因为它取决于模板参数T

作为旁注,请注意,当向量调整自身大小时,向量的迭代器会失效。因此,这些迭代器的向量可能没有可能想象的那么有用。要使这样的向量有用,请确保向量永远不会调整自身的大小,其迭代器将存储在此迭代器向量中。

答案 2 :(得分:1)

这很快就被问到了......

 vector<typename vector<T>::iterator>

问题是嵌套类型iterator依赖于模板的参数,因此您需要告诉编译器它是一个类型,否则它将假定它是一个常规模板。 / p>