gpt4 book ai didi

c++ - 如何在模板函数中使用 typedef?

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:20 24 4
gpt4 key购买 nike

我在这里尝试向后迭代多映射键,硬编码类型的函数有效。

#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;
}

但是当我尝试对函数进行模板化时:

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;
}
}

Typedef 告诉我它不喜欢被模板化:

error: type/value mismatch at argument 1 in template parameter list for
'template<class _Iterator> class std::reverse_iterator'

最佳答案

问题源于您使用的名称依赖于您使用模板参数实例化的另一个模板。

当编译器第一次遇到multimap_type::iterator时,它知道真正的意思是 multimap<Key, Val>::iterator它不知道是否iterator是否是类型(毕竟,它不知道将选择 multimap 的哪个实例化,因为它既不知道 Key 也不知道 Val )。

然而,了解名称是否表示类型对于解析很重要,因此编译器会进行猜测 - 这是“非类型”。

如果你想告诉编译器这将是一个类型,你必须这样告诉它:

typedef std::reverse_iterator<typename multimap_type::iterator> reverse_iterator;

关于c++ - 如何在模板函数中使用 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com