2017-08-08 30 views
0

我有一个代码如下,我不明白为什么编译器无法推断创建D类的实例时使用的构造函数。 我已经删除了这两个复制和移动的构造,因此唯一的办法是使用A(基地&)如何让编译器知道调用哪个函数的重载以避免模糊?

是,有一种方法来告诉编译器使用A(基地&)构造,除了铸造*这基地& 。

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) {} 

回答

1

添加投:

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

这将迫使表达有符合你期望过载的类型。

简单地删除一个函数或c'tor不会将它从重载集中删除,这就是为什么你会看到一个含糊不清的原因。如果函数从所有可用的重载中选择了,它只会使编译器认为该程序不合格。

1

可以提领之前转换指针:

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

D() :A(*static_cast<Base*>(this)) {} 
相关问题