UE开发-CloudV 2022-01-07 09:50 采纳率: 50%
浏览 21
已结题

关于类中定义了转换函数并重载加法运算符,出现二义性报错的问题

问题遇到的现象和发生背景

定义了一个Star类,为了让它和int类可以无缝转换,定义了转换函数,和只有int类型参数的构造函数。如下代码,问题在代码后

问题相关代码,请勿粘贴截图
#include <iostream>
using namespace std;

class Star
{
private:
    int a;
public:
    Star() { a = 0; }
    Star(int l) { a = l;}
    operator int() { cout << "转换函数" << endl ;return a * 2; }
    void get() { cout << a << endl; }
    Star operator+(const Star& rs) {
        cout << "加法运算符" << endl;
        Star temp((rs.a + a)*2);
        return temp;
    }
};

int main(){
    Star a(1);
    Star b = a + 2;    // 问题坐标1
    a.get();
    b.get();
}


运行结果及报错内容

在没有重载加法运算符时,代码中问题坐标1处, 无论是b = a + 2 或 b = 2 + a,都是将a转换成int类型。我解释为,因为Star类没有加法运算,int类型有加法运算所以会执行转换函数,将Star转换为int

定义了重载运算符后,代码中问题坐标1处,
b = 2 + a:还是调用转换函数,将 a 转换成int类型,进行加法运算
问题来了:b = a + 2:出现二义性报错,按理说不是应该是 a 调用了 Star 类中重载的加法运算符,将2传了进去,然后2就被转换成Star类型,进行Star类的加法运算么。为什么会有二义性报错?

  • 写回答

3条回答 默认 最新

  • 书山客 2022-01-07 09:55
    关注
    
    #include <iostream>
    using namespace std;
    class Star
    {
    private:
        int a;
    public:
        Star() { a = 0; }
        Star(int l) { a = l; }
        operator int() { cout << "转换函数" << endl; return a * 2; }
        void get() { cout << a << endl; }
        Star operator+(const Star& rs) {
            cout << "加法运算符" << endl;
            Star temp((rs.a + a) * 2);
            return temp;
        }
    };
    int main() {
        Star a(1);
        Star c(2);
    
        Star b = a + c;    // 问题坐标1
        a.get();
        b.get();
    }
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月7日
  • 创建了问题 1月7日

悬赏问题

  • ¥18 help me! 希望大家来看看 吉~
  • ¥15 C++显示超限兔子集结
  • ¥15 sql server 2012的下载出错
  • ¥15 图像识别用户软件开发
  • ¥20 类原生rom lineageos
  • ¥15 有没有会做中专,云计算,卷子的,有偿一百块
  • ¥15 HC32串口DMA循环发送数据
  • ¥15 Uni-App实现飞书授权登陆
  • ¥50 Qt应用中如何通过代码打开开发者工具devtools
  • ¥20 mpp硬解码h264转为yuv