Рассмотрим простой пример:
#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
};
Это компилируется, если вы просто объявляете функтор компаратора 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;
}
Обратите внимание, что я добавил встроенную функцию, чтобы избежать ошибок компоновщика. (Функции-члены, определенные в структуре, неявно встроены.)