【问题标题】:How to make compiler know which overload of a function to call to avoid ambiguity?如何让编译器知道要调用哪个函数的重载以避免歧义?
【发布时间】:2017-08-08 08:06:29
【问题描述】:

我有如下代码,但我不明白为什么编译器无法准确推断创建 D 类实例时要使用的构造函数。 我已经删除了复制和移动构造函数,所以唯一的选择是使用 A(Base&)

除了将 *this 强制转换为 Base& 之外,还有什么方法可以告诉编译器使用 A(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) {}

【问题讨论】:

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


    【解决方案1】:

    添加演员表:

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

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

    仅删除一个函数或 c'tor 并不会将其从重载集中删除,这就是您看到歧义的原因。如果从所有可用的重载中选择函数,它只会使编译器认为程序格式错误。

    【讨论】:

      【解决方案2】:

      您可以在取消引用之前强制转换指针:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 2020-04-15
        • 2016-10-01
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        • 2019-09-03
        相关资源
        最近更新 更多