Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在模板化函数中使用typedefs?_C++_Templates_Typedef - Fatal编程技术网

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;