C++ 如何在模板化函数中使用typedefs?
我在这里尝试向后迭代多重映射键,使用硬编码类型的函数可以工作C++ 如何在模板化函数中使用typedefs?,c++,templates,typedef,C++,Templates,Typedef,我在这里尝试向后迭代多重映射键,使用硬编码类型的函数可以工作 #include <map> #include <string> #include <iostream> using namespace std; multimap<int, string> mm = { {1, "a"}, {1, "lemon"}, {2, "peacock"}, {3, "angel"} }; void printKeysBackwards(multimap&l
#include <map>
#include <string>
#include <iostream>
using namespace std;
multimap<int, string> mm = { {1, "a"}, {1, "lemon"}, {2, "peacock"}, {3, "angel"} };
void printKeysBackwards(multimap<int, string> mm) {
typedef multimap<int, string> multimap_type;
typedef std::reverse_iterator<multimap_type::iterator> reverse_iterator;
for (auto it = mm.rbegin(), end = mm.rend(); it != end;
it = reverse_iterator(mm.lower_bound(it->first))) {
cout << (*it).first << endl;
}
}
int main() {
printKeysBackwards(mm);
return 0;
}
#包括
#包括
#包括
使用名称空间std;
多重映射mm={{1,“a”},{1,“柠檬”},{2,“孔雀”},{3,“天使”};
无效打印键向后(多贴图mm){
类型定义多映射多映射类型;
typedef std::reverse_迭代器reverse_迭代器;
对于(auto it=mm.rbegin(),end=mm.rend();it!=end;
it=反向迭代器(mm.下限(it->first))){
cout问题源于您使用的名称依赖于使用模板参数实例化的另一个模板
当编译器第一次遇到multimap\u type::iterator
时,它知道它真正的意思是multimap::iterator
,它无法知道iterator
是否将是一个类型(毕竟,它不知道将选择multimap
的哪个实例化,因为它既不知道Key
也不知道Val
)
然而,知道一个名称是否代表一个类型对于解析很重要,因此编译器会进行猜测,即“不是类型”
如果您想告诉编译器这将是一个类型,您必须这样告诉它:
typedef std::reverse_iterator<typename multimap_type::iterator> reverse_iterator;
typedef std::reverse\u迭代器reverse\u迭代器;
问题源于您使用的名称依赖于使用模板参数实例化的另一个模板
当编译器第一次遇到multimap\u type::iterator
时,它知道它真正的意思是multimap::iterator
,它无法知道iterator
是否将是一个类型(毕竟,它不知道将选择multimap
的哪个实例化,因为它既不知道Key
也不知道Val
)
然而,知道一个名称是否代表一个类型对于解析很重要,因此编译器会进行猜测,即“不是类型”
如果您想告诉编译器这将是一个类型,您必须这样告诉它:
typedef std::reverse_iterator<typename multimap_type::iterator> reverse_iterator;
typedef std::reverse\u迭代器reverse\u迭代器;
使用typedef std::reverse\u iterator reverse\u iterator;
使用typedef std::reverse\u iterator reverse\u iterator;
typedef std::reverse_iterator<typename multimap_type::iterator> reverse_iterator;