Не могу определить шаблонные типы для моего класса LruCache - PullRequest
2 голосов
/ 22 июня 2011
#include <map>
#include <list>

template < typename K, typename  V>
class LruCache
{
private:
    typedef std::pair< K, V > EntryPair;
    typedef std::list< EntryPair > CacheList;
    typedef std::map< K, CacheList::iterator > CacheMap;

public:
    LruCache(){}
    ~LruCache(){}
};

, если я попробую просто

кеш LruCache;

Я получаю следующую ошибку компиляции:

LruCache.h:17:46: error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’
LruCache.h:17:46: error:   expected a type, got ‘LruCache<K, V>::CacheList:: iterator’
LruCache.h:17:46: error: template argument 4 is invalid

Однако, если я определю класс без шаблонных типов. т.е.

class LruCache
{
private:
    typedef std::pair< int, int > EntryPair;
    typedef std::list< EntryPair > CacheList;
    typedef std::map< int, CacheList::iterator > CacheMap;

public:
    LruCache(){}
    ~LruCache(){}
};

Отлично компилируется.

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Используйте typename как:

typedef std::map< K,typename CacheList::iterator > CacheMap;
                   //^^^^^^

Это потому, что iterator является зависимым именем аргумента шаблона. Его значение зависит от CacheList, что в свою очередь зависит от T, который фактически является аргументом шаблона. Вот почему typename здесь необходимо, что говорит компилятору, что iterator на самом деле является вложенным типом , а не static значением .

Однако во втором случае это не зависимое имя.

Прочитайте подробное объяснение Йоханнеса:

1 голос
/ 22 июня 2011

Заменить это:

typedef std::map< K, CacheList::iterator > CacheMap;

с этим:

typedef std::map< K, typename CacheList::iterator > CacheMap;

См. этот вопрос . По сути, компилятор не знает (не зная аргументов шаблона), является ли CacheList::iterator типом или значением до времени создания экземпляра, и ему запрещено откладывать решение до тех пор, поэтому он предполагает, что это значение, и вы должны в противном случае дайте ему «подсказку».

...