如何让编译器知道要调用函数的哪个重载以避免歧义?
How to make compiler know which overload of a function to call to avoid 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) {}
添加演员表:
D():A(static_cast<Base&>(*this)){}
这将强制表达式具有与所需重载匹配的类型。
简单地删除一个函数或c'tor不会将其从重载集中删除,这就是为什么你会看到歧义的原因。如果从所有可用的重载中选择函数,则只会使编译器将程序视为格式不正确。
您可以在取消引用指针之前强制转换指针:
D() :A(*(Base*)this) {}
或
D() :A(*static_cast<Base*>(this)) {}
相关文章:
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- 通过继承重载运算符会导致歧义
- 运算符的歧义错误<<自定义 std::ostream 子类中的重载
- Int64 和 time_t 之间的 C++ 重载歧义
- 如何让编译器知道要调用函数的哪个重载以避免歧义?
- 如何解决以下代码中的函数重载歧义
- c++ 构造函数重载歧义与initializer_list
- 如何消除重载模板函数的歧义
- 解决 CRTP 函数重载歧义问题
- 为什么在重载区域函数时在波纹管代码的情况下会出现歧义
- C++中的重载歧义,用于自动将对象转换为"printable"格式
- 在 c++ 中使用重载的歧义错误
- 为什么any_cast函数重载不会导致歧义?
- 转换运算符重载歧义,编译器不同
- 错误:"std::copy "之间的重载歧义
- c++中按引用传递和按值传递之间重载歧义的实用解决方案
- 构造函数在尝试支持文字时重载歧义
- c++变量重载歧义
- boost和xercer XML解析器之间的重载歧义