找不到运算符<用于指针类型

时间:2012-11-05 13:14:38

标签: c++

我正在尝试使用带有重载<的插入排序来命令指针向量。 operator(不能使用任何库)。 有一个包含另一个类的类,如:

class A {   
 vector<B*> v;
 void order();
}

class B {
int id;                         //each one is unique
virtual double num() {} const;
bool operator<(const B* b2) const;
}

class B1: public B {
double num() {} const;
}

class B2: public B {
double num() {} const;
}

每个孩子都有不同的计算num的方法,并且使用num返回的double作为第一个标准,然后是id来完成排序。 (对不起缩进)

void A::order() {

for (unsigned int p = 1; p < v.size(); p++)    
{
    ClassB* tmp = v[p];
    int j;
    for (j = p; j > 0 && tmp < v[j-1]; j--) // Error on this line
        v[j] = v[j-1];
    v[j] = tmp;     
}

}



bool B::operator<(const B* b2) const {

cout << "Operator <\n";

if(this->num()!=b2->num())
    return this->num()<b2->num();

return id<d2->id;

}

我无法理解为什么在尝试比较2个指针时没有调用运算符。

2 个答案:

答案 0 :(得分:6)

此运算符

bool operator<(const B* b2) const;

允许您将LHS上的B与RHS上的B*进行比较。您试图与双方的B*进行比较,因此运算符不适用。

你不能重写指针比较运算符,所以一个解决方案可能是在B(或const B&)方面进行比较,并在比较时取消引用你的指针:

for (j = p; j > 0 && *tmp < *v[j-1]; j--)

答案 1 :(得分:3)

您不能重载运算符来比较指针。即使你可以,它在大多数时候仍然是非法的。您只能比较指向同一数组内存的指针,或数组结束后的一个位置。除此之外的任何事情都是未定义的行为。

您的B::bool operator<(const B* b2) const;实际应该是bool operator<(const B& b2) const;。这允许您比较2个B个对象,而不是对象和指向对象的指针 - 这是您的代码现在所做的

如果你必须对一个指针容器进行排序,你可以提供一个比较函数作为回调,它将2个指针作为参数,但是将operator<作为成员实现,并将指针作为参数没有意义。