使用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 = https://www.it610.com/article/Start, *RESTRICT DataEnd = Data + ArrayNum;
Data != DataEnd;
++Data)
{
if (*Data == Item)//这里
{
return static_cast(Data - Start);
}
}
return INDEX_NONE;
}
可以看到,是因为使用了TArray的Find方法,但是TArray储存的自定类型HUDMessage没有重载==运算符,所以*Data =https://www.it610.com/article/= 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();
}
【c++|error c2678解决方法】但是因为头文件的include顺序问题方法二总是重定义,于是选择方法一,编译通过。
这个问题告诉我们,还是应该仔细看error。。。
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题