如何创建模板类型的迭代器的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
个关键字
答案 0 :(得分:5)
答案 1 :(得分:4)
您需要将typename
用作:
vector<typename vector<T>::iterator> it2;
这是因为iterator
是一个依赖名称,因为它取决于模板参数T
。
作为旁注,请注意,当向量调整自身大小时,向量的迭代器会失效。因此,这些迭代器的向量可能没有可能想象的那么有用。要使这样的向量有用,请确保向量永远不会调整自身的大小,其迭代器将存储在此迭代器向量中。
答案 2 :(得分:1)
这很快就被问到了......
vector<typename vector<T>::iterator>
问题是嵌套类型iterator
依赖于模板的参数,因此您需要告诉编译器它是一个类型,否则它将假定它是一个常规模板。 / p>