Мне удалось избавиться от ошибки неоднозначности при использовании перегруженных функций от нескольких родителей, используя шаблон с родительским разрешением, но это дает ошибку компоновщика при поиске AddObjectImpl, что странно, поскольку эта функция является виртуальной ,C++ multiple template pure virtual inheritance
template<typename T>
class ObjectHandler
{
public:
virtual void AddObjectImpl(T& obj) = 0;
virtual void ClearObjectImpl(T& obj) = 0;
};
class INTERFACE_API IModel
: public ObjectHandler<type1>,
public ObjectHandler<type2>
{
public:
template<typename T>
void AddObject(T& obj)
{
this->ObjectHandler<T>::AddObjectImpl(obj);
}
template<typename T>
void ClearObject(T& obj)
{
this->ObjectHandler<T>::ClearObjectImpl(obj);
}
};
// In different project
class CModel : public IModel
{
virtual void AddObjectImpl(type1& o) override;
virtual void AddObjectImpl(type2& o) override;
virtual void ClearObjectImpl(type1& o) override;
virtual void ClearObjectImpl(type2& o) override;
}
// And then the implementation ...
EDIT1: Ошибка происходит при вызове AddObject:
error LNK2019: unresolved external symbol
"__declspec(dllimport) public: virtual void __cdecl
ObjectHandler<class type1>::AddObjectImpl(class type1 &)"
(/*removed*/) referenced in function "public: void __cdecl
IModel::AddObject<class type1>(class type1 &)"
Какая ошибка вы получаете? – NathanOliver
'this-> ObjectHandler :: AddObjectImpl (obj);' не является виртуальным вызовом. вы должны попробовать '((ObjectHandler *) this) -> AddObjectImpl (obj)'. –
Franck
@Franck Это похоже на работу, хотя я не понимаю, почему это был не виртуальный вызов, и почему ваш ответ работает. Если бы вы могли добавить свой ответ, чтобы я мог его выбрать, спасибо :) – ptrl4me