Как добавить дескриптор в качестве члена класса, где класс используется для шаблона кучи?

Рассмотрим простой пример:

#include <boost/heap/fibonacci_heap.hpp>

class MyClass;

struct compare_distances
{
bool operator()(const MyClass* n1, const MyClass* n2) const
{
return n1->distance > n2->distance;
}
};

typedef boost::heap::fibonacci_heap<MyClass*, boost::heap::compare<compare_distances> > fib_heap;

class MyClass
{
public:
string name;
double distance;
fib_heap::handle_type handle;
};

Я хочу иметь доступ к дескриптору объекта MyClass в куче таким образом. Поэтому я жду объявления MyClass. Но компилятор говорит:
ошибка: недопустимое использование неполного типа «const class MyClass» (ошибка для return линия в compare_distances).
Как это исправить?

Необходимо реализовать удобную сеть объектов, таких как:

class MyClass
{
public:
string name;
double distance;
fib_heap::handle_type handle[4]; // handles for other objects of MyClass
};

0

Решение

Это компилируется, если вы просто объявляете функтор компаратора operator() до MyClass и вы определяете его после определения класса следующим образом:

class MyClass;

struct compare_distances
{
inline bool operator()(const MyClass* n1, const MyClass* n2) const;
};

typedef boost::heap::fibonacci_heap<MyClass*, boost::heap::compare<compare_distances> > fib_heap;

class MyClass
{
public:
string name;
double distance;
fib_heap::handle_type handle;
};

bool compare_distances::operator()(const MyClass* n1, const MyClass* n2) const
{
return n1->distance > n2->distance;
}

Обратите внимание, что я добавил встроенную функцию, чтобы избежать ошибок компоновщика. (Функции-члены, определенные в структуре, неявно встроены.)

1

Другие решения


По вопросам рекламы [email protected]