如何让编译器知道调用函数的哪个重载以避免歧义?

时间:2017-08-08 08:06:30

标签: c++ constructor casting operator-overloading ambiguity

我有一个如下代码,我不明白为什么编译器无法推断在创建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) {}

2 个答案:

答案 0 :(得分:1)

添加演员:

D():A(static_cast<Base&>(*this)){}

这将强制表达式具有与您所需的重载相匹配的类型。

简单地删除一个函数或者c'tor并不会将它从重载集中删除,这就是你看到歧义的原因。只有当函数从所有可用的重载中选择时,它才会使编译器认为程序格式不正确。

答案 1 :(得分:0)

您可以在解除引用之前强制转换指针:

D() :A(*(Base*)this) {}

D() :A(*static_cast<Base*>(this)) {}