我有一个如下代码,我不明白为什么编译器无法推断在创建D类实例时要使用的构造函数。 我删除了复制和移动构造函数,因此唯一的选择是使用A(Base&)
是否有办法告诉编译器使用A(Base&)构造函数,除了将* this转换为Base&。
class Base {};
class A
{
private:
Base& m_b;
public:
A(Base& b) :m_b(b) {}
A(const A&) = delete;
A(A&&) = delete;
};
class D : public Base, public A
{
public:
D():A(*this){}
};
int main()
{
D();
}
我得到的错误如下:
main.cpp: In constructor 'D::D()':
main.cpp:17:16: error: call of overloaded 'A(D&)' is ambiguous
D():A(*this){}
^
main.cpp:10:5: note: candidate: A::A(const A&) <deleted>
A(const A&) = delete;
^
main.cpp:9:5: note: candidate: A::A(Base&)
A(Base& b) :m_b(b) {}
答案 0 :(得分:1)
添加演员:
D():A(static_cast<Base&>(*this)){}
这将强制表达式具有与您所需的重载相匹配的类型。
简单地删除一个函数或者c'tor并不会将它从重载集中删除,这就是你看到歧义的原因。只有当函数从所有可用的重载中选择时,它才会使编译器认为程序格式不正确。
答案 1 :(得分:0)
您可以在解除引用之前强制转换指针:
D() :A(*(Base*)this) {}
或
D() :A(*static_cast<Base*>(this)) {}