如何在模板类中使用模板

时间:2018-10-22 22:57:14

标签: c++ templates

如果要对以下LRU缓存类进行模板化,该怎么做?我反复收到以下错误:

Template argument for template type parameter must be a type; did you 
forget 'typename'?"

这是我的代码:

class LRU{
    int capacity;
public:
    std::list<std::pair<int, int>> doubly_queue;
    std::unordered_map<int, std::list<std::pair<int, int>>::iterator> elems;
    LRU(int c);
    int get(int key);
    void put(int key, int val);
};

LRU::LRU(int c){
   capacity = c;
}

如何使整个班级成为模板?

这是模板后的代码:

template<class T>
class LRU{
    int capacity;
public:
    std::list<std::pair<T, T>> doubly_queue;
    std::unordered_map<T, std::list<std::pair<T, T>>::iterator> elems;
    LRU(T c);
    int get(T key);
    void put(T key, T val);
};

2 个答案:

答案 0 :(得分:1)

template <typename Type>
class LRU {
    Type capacity;
public:
    std::list<std::pair<Type, Type>> doubly_queue;
    std::unordered_map<Type, typename std::list<std::pair<Type, Type>>::iterator> elems;
    LRU(Type c);
    Type get(Type key);
    void put(Type key, Type val);
};

template <typename Type>
LRU<Type>::LRU(Type c){
   capacity = c;
}

问题出在std::list<std::pair<Type, Type>>::iterator不是作为std::unordered_map模板的参数的类型。可以使用前面的typename关键字来解决。 在将typename应用于模板时,通常使用::

答案 1 :(得分:1)

您需要更改此行:

std::unordered_map<Type, std::list<std::pair<Type, Type>>::iterator> elems;

使用

std::unordered_map<Type, typename std::list<std::pair<Type, Type>>::iterator> elems;

之所以会发生这种情况,是因为您需要使用typename

从嵌套类型中明确消除成员访问语法的歧义。