我有2个基类。 第一个包含回调函数列表:
class BaseCallbacks {
public:
virtual void callback1() = 0;
virtual void callback2() = 0;
virtual ~BaseCallbacks(){};
};
第二课只包含一些对我未来专业课的所有版本都很常见的逻辑:
class BaseClass{
public:
BaseClass();
void some_function();
};
还有一个允许我与另一个应用程序交互的外部类:
class InterfaceClass {
public:
InterfaceClass(int x, int y, BaseCallbacks &callbacks);
virtual ~InterfaceClass(){};
};
我的派生类的一个特殊版本看起来像这样:
enum TYPE{TYPE1,TYPE2};
template<bool B, TYPE T>
class DerivedClass : public BaseClass, public BaseCallbacks
{
public:
DerivedClass(int a);
virtual void callback1() override;
virtual void callback2() override;
};
以下导致编译器错误:
int main()
{
DerivedClass<true, TYPE::TYPE1> D1(666);
auto interface_ptr = std::make_shared<InterfaceClass>(111, 222, &D1);
}
Visual Studio编译器说:&#34;错误C2664:&#39; InterfaceClass :: InterfaceClass(InterfaceClass&amp;)&#39; :无法转换&#39; DerivedClass&#39;到&#39; BaseCallbacks&#39; &#34;
据我所知,编译器无法弄清楚DerivedClass的对象是否包含所需的回调。问题是为什么?
我怀疑模板和多重继承与它有关。你们能不能对这个问题有所了解?提前谢谢。
答案 0 :(得分:0)
请注意,InterfaceClass
构造函数接受对BaseCallbacks
的引用:
InterfaceClass(int x, int y, BaseCallbacks &callbacks);
但是您尝试将指针传递给DerivedClass
(可转换为指向BaseCallbacks的指针):
std::make_shared<InterfaceClass>(111, 222, &D1);
所以,要解决这个问题,请传递D1
本身,而不是它的地址。