複数の親からオーバーロードされた関数を親の解像度で使用すると、あいまいなエラーを取り除くことができましたが、これはAddObjectImplを探すときにリンカーエラーをもたらします。 。C++複数テンプレート純粋仮想継承
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