rsk*_*k82 1 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<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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试模板功能时:
template <class Key, class Val>
void printKeysBackwards(multimap<Key, Val> mm) {
typedef multimap<Key, Val> 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;
}
}
Run Code Online (Sandbox Code Playgroud)
Typedef告诉我它不喜欢被模板化:
error: type/value mismatch at argument 1 in template parameter list for
'template<class _Iterator> class std::reverse_iterator'
Run Code Online (Sandbox Code Playgroud)
问题源于您使用的名称取决于您使用模板参数实例化的另一个模板.
当编译器第一次遇到时multimap_type::iterator,它知道它真的意味着multimap<Key, Val>::iterator它不知道是否iterator是一个类型(毕竟,它不知道multimap将选择哪个实例,因为它既不知道Key也不知道Val).
知道名称是否代表类型对于解析很重要,因此编译器会猜测 - 这是"非类型".
如果你想告诉编译器这将是一个类型,你必须告诉它:
typedef std::reverse_iterator<typename multimap_type::iterator> reverse_iterator;
Run Code Online (Sandbox Code Playgroud)