简体   繁体   English

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

[英]C++ - Template subclass inherits from multiple template classes

I am creating a simple class named HashMap : 我正在创建一个名为HashMap的简单类:

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

        class Hashable;

I created another class: 我创建了另一个类:

template<typename T> class Stack;

Now I must create a new class ( NewStackClass ), which extends Stack and HashMap<K,V>::Hashable . 现在,我必须创建一个新类( NewStackClass ),该类扩展了StackHashMap<K,V>::Hashable

Objects of this class are meant to be instantiated when K=Stack/NewStackClass. 打算在K = Stack / NewStackClass时实例化此类的对象。

Example: 例:

HashMap<NewStackClass<int>,int> map;
//T=int;K=NewStackClass<int>;V=int;

or: 要么:

HashMap<Stack<char>,int> map;
//T=char;K=Stack<char>;V=int;

How can I obtain this? 我如何获得这个? Also, I want to split class declaration from its implementation. 另外,我想从其实现中拆分类声明。

I already tried with this: 我已经尝试过了:

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

but it didn't work: 但是没有用:

[Error] too many template-parameter-lists [错误]模板参数列表过多

Any help is appreciated. 任何帮助表示赞赏。

EDIT 编辑

Creating NewStackclass: 创建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;
        }
    };

Let's get in the private area of HashMap class: 让我们进入HashMap类的私有区域:

private:

    int hash(const Hashable& key) const{

        return (31*17 +key.hashCode()) % TABLE_SIZE;
    }

Doing this in main.cpp: 在main.cpp中执行以下操作:

HashMap<NewStackClass<int,int>,int> map1;

NewStackClass<int,int> stack;
map1.put(stack,0);

Brings out this error: 带出此错误:

[Error] no matching function for call to "HashMap<NewStackClass<int, int>, int>::hash(const NewStackClass<int, int>&)"

Error comes from this: 错误来自于此:

[Note] no known conversion for argument 1 from 'const NewStackClass' to 'const HashMap, int>::Hashable&' [注意]参数1从'const NewStackClass'到'const HashMap,int> :: Hashable&'的未知转换

Your code contains a syntactical flaw. 您的代码包含语法缺陷。 You may only have a single template parameter list for your class. 您的类可能只有一个模板参数列表。

merge 合并

template <typename B, typename C>
template <typename A> class NewStackClass ...

to this 对此

template <typename B, typename C, typename A>
class NewStackClass ...

to make it compile. 使其编译。 Also you did not provide information on what MyStack is supposed to be. 另外,您也没有提供有关MyStack应该是什么的信息。 I just assume that you meant to write Stack instead. 我只是假设您打算写Stack

You should also think about whether your class NewStackClass really needs three template arguments or if there are actually only two distinct ones. 您还应该考虑类NewStackClass是否确实需要三个模板参数,或者实际上是否只有两个不同的参数。

Judging by your question, your might want to do: 根据您的问题判断,您可能想要执行以下操作:

template <typename K, typename V>
class NewStackClass : public Stack<K>, public HashMap<Stack<K>,V>::Hashable {

instead. 代替。

Fixed Code (Syntax Only) 固定代码(仅语法)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM