2010-09-19 4 views
0

привет, я создаю шаблон в C++, и мне нужно перезаписать оператор «<» внутри шаблона, чтобы иметь возможность сравнивать элементы внутри моей структуры данных. Кто-нибудь может рассказать мне, как его переписать ... Должен ли я отправить указатель на функцию внутри конструктора шаблона? У меня есть два шаблона, первый из которых - шаблон узла, который содержит указатель на данные, которыми я управляю. , а второй - шаблон кучи, который имеет вектор узлов *. В моей реализации я должен иметь возможность сравнивать между узлами *.Как перезаписать оператор внутри шаблона

ответ

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

Если шаблон предназначен для типа элемента, просто предположите, что у них есть компаратор, т. Е. * Узел < * узел.

+0

Что вы имеете в виду, предполагая, что у них есть компаратор, у них нет компаратора, и мне нужно сделать 1, мой вопрос в том, где и как мне реализовать перезапись. –

+0

Как, черт возьми, вы могли бы создать компаратор для типа, которого вы не создали? – Puppy

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) ...).

Смежные вопросы