2012-11-05 64 views
3

我試圖使用插入排序與超載<運算符(不能使用任何庫)的指針向量。 具有包含另一個類,像這樣:無法找到運算符<對於指針類型

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返回的第一個條件,然後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個三分球時,操作者不會被調用。

+0

什麼是'ClassB'? – jalf

回答

6

此操作

bool operator<(const B* b2) const; 

允許您在B在LHS比較反對在RHS一個B*。您試圖在兩側與B*進行比較,因此操作員不適用。

你不能重載指針比較運算,所以一個解決辦法是在B(或const B&)方面來比較,在比較的角度去引用您的指針:

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

+1重要的是要注意,你不能重載比較指針(在代碼中也不需要) –

3

你不能重載運算符來比較指針。即使你可以,大部分時間仍然是非法的。只能比較指向同一數組內的內存的指針或數組結束後的一個位置。除此之外的任何東西都是未定義的行爲。您的B::bool operator<(const B* b2) const;實際上應該是bool operator<(const B& b2) const;。這允許您比較2個B對象,而不是對象和指向對象的指針 - 這就是您的代碼現在的工作

如果你有排序指針的容器,你可以提供一個比較功能的回調需要2個指針作爲參數,但實施operator<作爲成員的指針爲參數沒有意義。