#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(){}
};
它编译得很好。
答案 0 :(得分:2)
将typename
用作:
typedef std::map< K,typename CacheList::iterator > CacheMap;
//^^^^^^
因为iterator
是模板参数的从属名称。它的值取决于<{em}} CacheList
,而依赖 T
,这实际上是一个模板参数。这就是为什么typename
需要它来告诉编译器iterator
实际上是嵌套的 类型 ,而不是static
值 即可。
但是,在第二种情况下,它不是从属名称。
阅读约翰内斯的详细解释:
答案 1 :(得分:1)
替换它:
typedef std::map< K, CacheList::iterator > CacheMap;
用这个:
typedef std::map< K, typename CacheList::iterator > CacheMap;
见this question。基本上,编译器不知道(不知道模板参数)CacheList::iterator
是实例化时间之前的类型还是值,并且禁止在此之前推迟决策,因此它假设它是一个值而你不得不给它一个“暗示”。