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

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

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

最佳答案

您必须添加 typename 关键字:

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

This page 对我的理解帮助最大。

关于c++ - 如何创建模板类型迭代器的 STL 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10397338/

相关文章:

c++ - 根据参数在 C++ 中重载运算符 "+"

c++ - Boost Single Pass Iterator 和 Forward Traversal Iterator 有什么区别?

c++ - 可以容纳任何东西的非模板容器

c++ - 仅威胁独特的字符串——什么是更快的 vector<std::string> 或只是 std::string

c++ - 随机访问不同大小的原始缓冲区数组?

c++ - Angelscript - 应为 ',' 或 ')'

c++ - DEFINE 宏是否适用于所有平台?

c++ - 通过套接字发送结构;服务器和客户端在同一台机器上

c++ - 类模板状态数据成员,而不是可以显式特化的实体

c++ - 将 std::vector<char> 截断为长度 N 以释放内存的有效方法