【发布时间】:2016-11-14 17:19:42
【问题描述】:
通过使用带有父级解析的模板,我已经设法在使用来自多个父级的重载函数时消除了歧义错误,但是在查找 AddObjectImpl 时会出现链接器错误,这很奇怪,因为该函数是虚拟的。
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 &)"
【问题讨论】:
-
你得到的错误是什么?
-
this->ObjectHandler<T>::AddObjectImpl(obj);不是虚拟通话。你应该试试((ObjectHandler<T>*) this)->AddObjectImpl(obj)。 -
@Franck 这似乎有效,但我不明白为什么它不是虚拟通话,以及为什么你的答案有效。如果您可以添加您的答案以便我选择它,谢谢:)
标签: c++ inheritance linker