我正在创建一个名为HashMap
的简单类:
template <typename K,typename V> class HashMap{
.
.
.
public:
class Hashable;
我创建了另一个类:
template<typename T> class Stack;
现在我必须创建一个新类NewStackClass
),它扩展了Stack
和HashMap<K,V>::Hashable
。
当K = Stack / NewStackClass时,该类的对象将被实例化。
示例:
HashMap<NewStackClass<int>,int> map;
//T=int;K=NewStackClass<int>;V=int;
或:
HashMap<Stack<char>,int> map;
//T=char;K=Stack<char>;V=int;
我怎样才能获得这个?另外,我想从实现中拆分类声明。
我已经尝试过这个:
template <typename B, typename C>
template <typename A> class NewStackClass : public Stack<A>, public HashMap<B,C>::Hashable{
virtual int hashCode() const;
bool operator==(const MyStack<A>& stack);
};
但它不起作用:
[错误]模板参数列表太多
感谢任何帮助。
修改
创建NewStackclass:
template <typename StackType,typename HashMapValue> class MyStack : public NewStackClass<StackType>, public HashMap<Stack<StackType>,HashMapValue>::Hashable{
virtual int hashCode() const {
return 1;
}
bool operator==(const NewStackClass<StackType,HashMapValue>& stack){
return true;
}
};
让我们进入HashMap
类的私人区域:
private:
int hash(const Hashable& key) const{
return (31*17 +key.hashCode()) % TABLE_SIZE;
}
在main.cpp中执行此操作:
HashMap<NewStackClass<int,int>,int> map1;
NewStackClass<int,int> stack;
map1.put(stack,0);
列出这个错误:
[Error] no matching function for call to "HashMap<NewStackClass<int, int>, int>::hash(const NewStackClass<int, int>&)"
错误来自:
[注意]参数1从'const NewStackClass'到'const HashMap,int&gt; :: Hashable&amp;'
没有已知的转换
答案 0 :(得分:3)
您的代码包含语法缺陷。您的班级可能只有一个模板参数列表。
合并
template <typename B, typename C>
template <typename A> class NewStackClass ...
到这个
template <typename B, typename C, typename A>
class NewStackClass ...
使其编译。
此外,您没有提供MyStack
应该是什么的信息。我只是假设您打算改为编写Stack
。
您还应该考虑您的班级NewStackClass
是否确实需要三个模板参数,或者实际上只有两个不同的参数。
根据您的问题判断,您可能希望这样做:
template <typename K, typename V>
class NewStackClass : public Stack<K>, public HashMap<Stack<K>,V>::Hashable {
代替。
template <typename K,typename V>
class HashMap {
public:
class Hashable {
};
};
template<typename T> class Stack {
};
template <typename B, typename C, typename A>
class NewStackClass : public Stack<A>, public HashMap<B,C>::Hashable {
virtual int hashCode() const;
bool operator==(const Stack<A>& stack);
};