回 帖 发 新 帖 刷新版面

主题:关于操作符重载,求高手指点。

classA{
...
friend  bool operator<(const CString &str1,const CString &str2);
}

bool operator<(const CString &str1,const CString &str2)
{
...//实现比较2个字符串大小
}

bool SortByName(const Dev* DevStr1, const Dev* DevStr2)
{
    return DevStr1->swzName<DevStr2->swzName;
}

void A::DevOrder(int iType,deque<Dev *> &devs)
{
 sort(devs.begin(), devs.end(), SortByName);
}

error C2593: 'operator <' is ambiguous    

怎么弄也不行,友元类重载<操作符,主要实现名字字符串的排序,排序规则自己定义,但是重载不行,高手指点下,谢谢。

回复列表 (共4个回复)

沙发

如果您使用的是VC自带的CString的话,它本身就应该支持operator <了,此时如果再自己定义一份,则出现矛盾(存在两份实现)。
另外,class A里面也不需要声明那个friend。因为比较两个CString的时候,与class A没有什么关系。

板凳

谢谢,我现在想要在自己的类CLASS A里,对容器排序,根据容器里的CSTRING字段,但我又不想用CSTRING的<,这个没办法实现吗?你的意思是用了自带的CSTRING,就无法重载CSTRING的<操作符吗?谢谢指点。

3 楼

每一个类,都只能最多定义一个operator <。不会有一个类定义多个operator <。这个无法再重载了。

当然,对于排序来说,std::sort并非如此死板。它可以用一个函数(或者一个看起来像函数的东西)来代替operator <。比如在您的程序中,就使用SortByName函数代替了operator <。也就是说,排序时对两个Dev *,不是调用operator<,看谁小就排在前面,而是调用SortByName(p1, p2),如果返回true,就把p1排在p2前面。

您是这么写的:
bool SortByName(const Dev* DevStr1, const Dev* DevStr2)
{
    return DevStr1->swzName<DevStr2->swzName;
}

这里的“<”其实调用了CString的operator <。
如果不希望调用CString的operator <,可以这么写:
const char* pName1 = (const char*)DevStr1->swzName;
const char* pName2 = (const char*)DevStr2->swzName;
return strcmp(pName1, pName2) < 0;

4 楼

谢谢您的回答,是我对重载理解不够,你说的方法很好,现在问题解决了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册