如何在模板化函数中使用typedef?

时间:2014-05-05 19:39:19

标签: 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;
}

但是当我尝试模板化功能时:

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'

2 个答案:

答案 0 :(得分:5)

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

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

知道名称是否代表一种类型对于解析很重要,因此编译器会猜测 - 这是&#34;不是类型&#34;。

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

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

答案 1 :(得分:2)

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