如何覆盖模板中的运算符

时间:2010-09-19 11:38:10

标签: c++ templates

你好我在c ++中构建一个模板,我需要覆盖运算符“<”在模板内部,可以比较我的数据结构中的项目。 任何人都可以告诉我如何覆盖它...我应该发送一个指向模板构造函数内的函数的指针吗? 我有两个模板,第一个是Node模板,它包含一个指向我正在管理的数据的指针。 第二个是Heap模板,它有一个节点矢量*。 在我的实现中,我应该能够比较节点*。

3 个答案:

答案 0 :(得分:1)

这会吗?我故意提供'operator<'在命名空间范围内,以便它更通用,但在注释中显示如何执行此操作。

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;
}

答案 1 :(得分:0)

如果模板用于项目类型,则假设它们具有比较器,即* node&lt; *节点。

答案 2 :(得分: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) ...)进行比较。