error c2678解决方法

使用UE4时发生
error C2678: binary ‘==’ : no operator found which takes a left-hand operand of type ‘const HUDMessage’ (or there is no acceptable conversion)

最后可以定位到这里

int32 Find(const ElementType& Item) const
    {
        const ElementType* RESTRICT Start = GetData();
        for (const ElementType* RESTRICT Data = Start, *RESTRICT DataEnd = Data + ArrayNum; Data != DataEnd; ++Data)
        {
            if (*Data == Item)//这里
            {
                return static_cast<int32>(Data - Start);
            }
        }
        return INDEX_NONE;
    }

可以看到,是因为使用了TArray的Find方法,但是TArray储存的自定类型HUDMessage没有重载==运算符,所以*Data == Item找不到指定运算符重载。于是添加:

bool HUDMessage::operator ==(const HUDMessage& a)
    {
        return this->text.ToString() == a.text.ToString();
    }

结果还是报错。。。
最后再次仔细阅读错误信息,发现
left-hand operand of type ‘const HUDMessage’
这一句提到接受的操作数是const HUDMessage,于是就明白了,Data在上下文中可以看到,是一个const类型,这时候编译器找的是左右操作数都为const的operator ==,而不是我们重载的左操作数为正常变量,右操作数为const的operator ==。所以解决方法有二:
1.重载函数加const修饰符,本质是使编译时加入的this指针变为const,即左操作数变为const

bool HUDMessage::operator ==(const HUDMessage& a)const
    {
        return this->text.ToString() == a.text.ToString();
    }

2.直接全局重载相应运算符

bool operator ==(const HUDMessage& a,const HUDMessage& b)
{
    return a.text.ToString() == b.text.ToString();
}

但是因为头文件的include顺序问题方法二总是重定义,于是选择方法一,编译通过。
这个问题告诉我们,还是应该仔细看error。。。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值