[英]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.