为什么在CList模板类中,Find函数编译不过

sssn 2005-11-16 10:48:55
在CList<CString,CString&>中,Find函数就没有问题!


提示的错误如下:
c:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h(122) : error C2678: binary '==' : no operator defined which takes a left-hand operand of type 'const class CQulity' (or there is no acceptable conversion)
c:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h(1036) : see reference to function template instantiation 'int __stdcall CompareElements(const class CQulity *,const class CQulity *)' being compiled
Error executing cl.exe.


class CQulity : public CObject
{
public:
CQulity();
CQulity(/*CTime T,*/double V,double Target,double DeltT);
CQulity(/*CTime T,*/double V);
virtual ~CQulity();
// CTime MeasureTime;
double Value;
double Target;
double DeltTarget;

// void operator =( Qulity QulityValue );
BOOL operator ==(CQulity& Qulityright);
void operator =(CQulity& Qulity);
void ReadQulity();
void SaveQulity();
};
...全文
197 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sssn 2005-11-21
  • 打赏
  • 举报
回复
问题解决了,可以不需要拷贝构造函数,要的时候参数必须是const的
必须重载==运算符,并且函数的后面必须加const
菜牛 2005-11-16
  • 打赏
  • 举报
回复
编译器错误 C2678

二进制“operator”: 没有接受“type”类型的左操作数的已定义运算符(或者没有可接受的转换)

若要使用该运算符,必须针对指定类型将其重载,或者定义一个到某个类型(该运算符已针对此类型进行了定义)的转换。



你可能是和double类型进行比较吧?因为你这个operator ==(CQulity& Qulityright)要求传入一个CQulity类型,如果传入普通类型需要进行类型转换,也就是构造新的临时CQulity对象,需要拷贝构造函数。或者,另外定义一个operator==,参数为你需要的类型,比如double。
菜牛 2005-11-16
  • 打赏
  • 举报
回复
要实现拷贝构造函数和operator=
sssn 2005-11-16
  • 打赏
  • 举报
回复
有没有碰到类似问题的,最好能给个例子
zx_sanjin 2005-11-16
  • 打赏
  • 举报
回复
*this == Qulity; 的确有问题,递归调用导致堆栈溢出。

不过不是楼主当前的编译问题,等到出错的时候她自然就明白了,呵呵

-------------------------------------------------------
MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
下载地址:http://nj.onlinedown.net/soft/6591.htm
wind0513 2005-11-16
  • 打赏
  • 举报
回复
楼上的正确
要重写
CompareElements
zx_sanjin 2005-11-16
  • 打赏
  • 举报
回复
BOOL AFXAPI CompareElements(const TYPE* pElement1, const ARG_TYPE* pElement2)

注意这两个参数都是const的

-------------------------------------------------------
MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
下载地址:http://nj.onlinedown.net/soft/6591.htm
zx_sanjin 2005-11-16
  • 打赏
  • 举报
回复
#include <afxtempl.h>
class A
{
public:
BOOL operator == (A value) const
{
return TRUE;
}
};


void CDialogTestDlg::OnOK()
{
CList<A,A&> list;

A a;
list.Find(a);
}

以上代码在我的机器上测试通过,XP+VC6.0
const去掉将提示跟你一样的错误,请仔细核对!!


-------------------------------------------------------
MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
下载地址:http://nj.onlinedown.net/soft/6591.htm
快乐鹦鹉 2005-11-16
  • 打赏
  • 举报
回复
BOOL AFXAPI CompareElements(const TYPE* pElement1, const ARG_TYPE* pElement2)
{
ASSERT(AfxIsValidAddress(pElement1, sizeof(TYPE), FALSE));
ASSERT(AfxIsValidAddress(pElement2, sizeof(ARG_TYPE), FALSE));

return *pElement1 == *pElement2;
}
这段代码的依托就是pElement对象有operator == 重载的啊。并不是说你的operator==重载函数中也可以return *this == Qulity;这么写啊。你这么写,不又是调用Qulity对象的==函数么?
sssn 2005-11-16
  • 打赏
  • 举报
回复
to zx_sanjin((恒金软件)-不结贴我跟你急!) ( ) 信誉:86
加上const还是那样的错误

to 84830388(难的问题请别找我) ( ) 信誉:106
在afxtempl.h头文件里就有这样的语句,为什么不可以呢?
template<class TYPE, class ARG_TYPE>
BOOL AFXAPI CompareElements(const TYPE* pElement1, const ARG_TYPE* pElement2)
{
ASSERT(AfxIsValidAddress(pElement1, sizeof(TYPE), FALSE));
ASSERT(AfxIsValidAddress(pElement2, sizeof(ARG_TYPE), FALSE));

return *pElement1 == *pElement2;
}

zx_sanjin 2005-11-16
  • 打赏
  • 举报
回复
把你的==操作后面加上const,如:

BOOL operator == (A value) const
{
return TRUE;
}


-------------------------------------------------------
MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)
可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
下载地址:http://nj.onlinedown.net/soft/6591.htm
84830388 2005-11-16
  • 打赏
  • 举报
回复
return *this == Qulity;
这句能行么?
sssn 2005-11-16
  • 打赏
  • 举报
回复
我已经重载过==操作符了,麻烦你们先随便做一个例子试试看行不行

BOOL CQulity::operator ==(CQulity& Qulity)
{
if((this->DeltTarget==Qulity.DeltTarget)&&(this->Target==Qulity.Target)&&(this->Value==Qulity.Value))
return *this == Qulity;
else
return FALSE;
}
快乐鹦鹉 2005-11-16
  • 打赏
  • 举报
回复
CMyClass类中没有重载==操作符,因此编译器无法判断两个CMyClass对象是否相等。
假设CMyClass中有个id变量,那么可以这样:
BOOL operator == (const CMyClass &myClass)
{
if(m_nID == myClass.m_nID)
return TRUE;
return FALSE;
}就可以了。当然,如果没有这样唯一的ID,可以判断两个CMyClass对象的每个成员变量值是否都相等来判断。
sssn 2005-11-16
  • 打赏
  • 举报
回复
BOOL CQulity::operator ==(CQulity& Qulityright)
{
return *this == Qulityright;
}

void CQulity::operator =(CQulity& Qulity)
{
DeltTarget = Qulity.DeltTarget;
Target = Qulity.Target;
Value = Qulity.Value;
}

在调用的时候:
CList<CQulity,CQulity&> List;
CQulity* pQulity = new CQulity(10.0,1.0,2.0);

CQulity q = *pQulity;
List.AddHead(q);
List.Find(q,NULL);
菜牛 2005-11-16
  • 打赏
  • 举报
回复
多点代码,你怎么比较的?
sssn 2005-11-16
  • 打赏
  • 举报
回复
我已经定义了拷贝构造函数和operator==,可是问题还是照旧

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧