2010-09-19 61 views
0

您好我正在C++中構建模板,並且我需要覆蓋模板內的運算符「<」,以便能夠在我的數據結構中的項目之間進行比較。 任何人都可以請告訴我如何覆蓋它......我應該發送一個指向模板的構造函數內的函數的指針? 我有兩個模板,第一個是Node模板,它包含一個指向我管理的數據的指針。 ,第二個是具有節點*向量的堆模板。 在我的實現中,我應該能夠比較節點*。如何覆蓋模板中的運算符

回答

1

請問這樣做?我特意在命名空間範圍內提供了'運算符<',以便它更通用,儘管它在註釋中顯示瞭如何操作。

template<class T> struct A; 

template<class T, class U>  // Remove U and modify accordingly, if f and s 
           // have to be of the same type. 
bool operator < (A<T> const &f, A<U> const &s){ 
    // have the logic here 
    return true; 
} 

template<class T> struct A{ 
    // template<class U>    // This is how you define inside a class. 
    // bool operator < (A<U> const &s){ 
    // have logic here 
    // return true; 
    // } 
}; 

int main(){ 
    A<int> a; 
    A<double> d; 

    bool b = a < d; 
} 
0

如果模板用於項目類型,那麼假設它們有一個比較器,即* node < *節點。

+0

你是什麼假設他們有一個比較的意思是,他們沒有一個比較,我需要做1,我的問題是在哪裏,我應該如何實現覆蓋。 – 2010-09-19 11:47:24

+0

怎麼你可能會創建一個你沒有創建的類型的比較器? – Puppy 2010-09-19 12:09:03

0

在C++中重載操作符其實很簡單。也許你想在你的節點類做的是:

template<typename MyData> 
class Node { 
private: 
    MyData data_; 
    // ... 

public: 
    // ... 
    bool operator < (Node const &rhs) const; 
}; 

// ... 

template<typename MyData> 
bool Node<MyData>::operator < (Node const &rhs) const { 
    return data_ < rhs.data_; 
} 

這在超載的Node<運營商,僅僅調用底層data_值的<運營商版本。

你可以把任何你想要的代碼放在函數內,除了它的名字和參數個數沒有特殊的屬性。你甚至可以使用它來比較不同的類型或返回不同的值。例如,您可以將rhs更改爲int,然後您可以將節點與整數進行比較(例如Node n; if (n < 10) ...)。