【发布时间】:2012-05-10 23:00:32
【问题描述】:
如何创建模板类型迭代器的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;
也应该失败,但它没有。如果依赖名称是typedef,它似乎只会失败并需要typename 关键字
【问题讨论】:
-
您的注释不正确。任何命名类型的从属名称都需要
typename,但在vector<vector<T> >的情况下,没有从属名称。 (vector和T都不是)
标签: c++ visual-c++ stl iterator g++