如何在模板类中使用模板

How to use templates inside template class

本文关键字:      更新时间:2023-10-16

如果我想使以下 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);
};

您需要更改此行:

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显式消除嵌套类型中成员访问语法的歧义

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通常在将::应用于模板时使用。

相关文章:
  • 没有找到相关文章