2

如何创建模板类型迭代器的 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

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 回答