繁体   English   中英

C ++从相同的基本模板歧义继承

[英]C++ Multiple inheritance from same base template ambiguity

我有以下情况:

我有一个使用ListNode类的List类,该类在要放入列表中的类中继承。

struct _List_node_base
{
...
 void _M_hook(_List_node_base* const __position);
 void unhook();
};


template<typename _Tp>
class ListNode : public _List_node_base
{
...
        typedef _Tp* pointer;
public:
 pointer GetNext();
 pointer GetPrev();
};


template<typename _Tp>
class List
{
  ...
};

我也有一个HashTable类,类似于列表中有一个HashNode类。 HashNode使用ListNode以便将其放入适当的哈希槽中的列表中。

    template<typename _KeyType, typename _ObjectType>
    class HashNode : public ListNode<ObjectType>
    {
...
    public:
          _KeyType GetHashKey()
    };



    template<typename _KeyType, typename _ObjectType, typename _HashFunctionType>
    class HashTable
    {
       //example

     template<typename _KeyType, typename _ObjectType, typename _HashFunctionType>
     void HashTable<_KeyType, _ObjectType, _HashFunctionType>::Insert(_ObjectType *object)
     {
      uint pos = hashFunction(object->GetHashKey(), tableSize);

      hashTable[pos].PushBack(object);
     }

    };

我有一类希望既可列出又可散列的类。

class A : public HashNode<SomeKeyType_t, A>, public ListNode<A>
{
 ...
};

问题在于,编译器抱怨List_node_base中的成员具有类A的基数不明确。

在Hash类和List类中,它们都直接在类A上使用ListNode和List_node_base中的方法。

基本上,我想使A类既可哈希又可列出,但HashNode的ListNode功能不应在类HashTable的实现之外公开。

这些类的重点还在于它们必须是侵入式的,不允许动态分配,并且不允许复制类。 否则,可以通过创建容器类来解决此问题。

我不确定我是否喜欢该设计,但是无论如何,您都可以通过在_List_node_base上使用虚拟继承来解决您的问题。

我认为更好的设计是避免继承,而使用如下所示的方法:

template <typename _KeyType, typename _ObjectType>
struct HashEntry {
    typedef ListNode<HashEntry> Node;

    _KeyType key;
    _ObjectType object;
    ...
};

顺便说一句, _<uppercase-letter>...是为实现保留的。 您不应该在自己的符号名称中使用它。

由于HashNode是ListNode的派生类,因此在对象层次结构中两次具有相同的“父”类。

尽可能避免非抽象类的多重继承。 如果绝对需要一个从2个基类继承的类,则应重新评估您的设计模式和/或研究使该类可以实现的接口(抽象)类。

您是否可以使用包含智能指针的STL / boost容器(例如boost :: shared_ptr)来解决类必须不可复制构造和不可复制分配的问题?

暂无
暂无

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

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