C ++ - 模板子类继承自多个模板类

时间:2017-01-24 23:11:04

标签: c++ templates inheritance

我正在创建一个名为HashMap的简单类:

template <typename K,typename V> class HashMap{
    .
    .
    .
    public:

        class Hashable;

我创建了另一个类:

template<typename T> class Stack;

现在我必须创建一个新类NewStackClass),它扩展了StackHashMap<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;'

没有已知的转换

1 个答案:

答案 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);
};