运算符重载和函数重载会产生模糊的编译器错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运算符重载和函数重载会产生模糊的编译器错误相关的知识,希望对你有一定的参考价值。

在给定的代码中,我无法理解为什么编译器在调用函数时会产生错误。它传递的是test类的对象,它的数据成员是test2

class Test2 
    int y;
;

class Test 
    int x;
    Test2 t2;
public:
    operator Test2 () return t2;
    operator int () return x;
;

void fun (int x)  
    cout << "fun(int) called";


void fun (Test2 t) 
    cout << "fun(Test 2) called";


int main() 
    Test t;
    fun(t);
    return 0;

答案

我无法理解为什么编译器在调用函数时会产生错误

编译器应该如何确定要调用哪个函数?在与名称func相关联的重载集中有两个函数,以及两个允许隐式转换为同样匹配此重载集的两个函数参数的类型的运算符。

情况与此相同

void f(long);
void f(short);

f(42); // Error: both conversions int -> log and int -> short possible

您可以通过例如修复它

fun(static_cast<Test2>(t)); // be explicit on the calling side

或者将一个(或两个)转换运算符标记为explicit

explicit operator Test2 () return t2;

它会禁用对Test2的隐式转换,并需要显式转换,如前所示。

另一答案

调用fun(t);是不明确的,因为fun的重载都符合条件。

这也是因为t是一个Test对象,可以转换为Test2int

将其中一个转换运算符标记为explicit将解决此问题。

在这里查看Demo

以上是关于运算符重载和函数重载会产生模糊的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

重载类的new和delete运算符成员函数

C++ 输入/输出运算符重载

什么是Java 方法重载?

重载运算

重载运算

运算符重载