2014-05-05 27 views
1

我在這裏嘗試向後迭代multimap鍵,使用硬編碼類型的函數工作。如何在模板化函數中使用typedefs?

#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' 

回答

5

問題莖名稱取決於您使用模板參數實例化的另一個模板。

當編譯器第一次遇到multimap_type::iterator,它知道真正的意思multimap<Key, Val>::iterator它無法知道iterator將是一個類型或者沒有(畢竟,它不知道它的multimap實例將被選擇,因爲它既不知道Key也不Val)。

然而,知道名稱是否代表類型對於解析非常重要,因此編譯器會進行猜測 - 這是「不是類型」。

如果你想告訴編譯器,這將是一個類型,你必須告訴它這樣:

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

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

相關問題