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

How to make compiler know which overload of a function to call to avoid ambiguity?

本文关键字:重载 歧义 函数 编译器 调用      更新时间:2023-10-16

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

添加演员表:

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

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

简单地删除一个函数或c'tor不会将其从重载集中删除,这就是为什么你会看到歧义的原因。如果从所有可用的重载中选择函数,则只会使编译器将程序视为格式不正确。

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

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

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