无法为我的LruCache类定义模板化类型

|
#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(){}
};
它编译就好了。     
已邀请:
        将ѭ3用作:
typedef std::map< K,typename CacheList::iterator > CacheMap;
                   //^^^^^^
这是因为“ 5”是模板参数的从属名称。它的值取决于
CacheList
,而后者又取决于turn7ѭ,实际上是模板参数。这就是为什么在这里需要
typename
来告诉编译器
iterator
实际上是嵌套类型,而不是
static
值。 但是,在第二种情况下,它不是从属名称。 阅读约翰内斯的详细解释: 为什么必须在何处以及为什么要放置“模板”和“类型名”关键字?     
        替换为:
typedef std::map< K, CacheList::iterator > CacheMap;
有了这个:
typedef std::map< K, typename CacheList::iterator > CacheMap;
看到这个问题。基本上,编译器直到实例化时间才知道(不知道模板参数)a13(是类型还是值,并且禁止将决策推迟到那时,因此假定它是一个值否则,您必须给它“提示”。     

要回复问题请先登录注册