Возвращение priority_queue с пользовательским компаратором - PullRequest
2 голосов
/ 03 декабря 2010

У меня есть функция, которая должна возвращать отсортированный список на основе некоторых входных параметров. Я выбрал std::priority_queue для хранения этого списка.

Но компилятор выдаёт мне ошибку, которую я не узнаю. Вот код, который у меня есть:

struct DepthCompare {
    bool operator()
        (const struct inst *&lhs, const struct inst *&rhs) const
    {
        return lhs->depth < rhs->depth;
    }
};

typedef priority_queue<struct inst*> HeuristicList;
HeuristicList getHeuristicList(struct BasicBlock &) {

    HeuristicList ret( DepthCompare );
    return ret;
}

Компилятор говорит, что conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested в строке оператора return.

Не похоже, что я пытаюсь вернуть указатель. Что не так?

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

У вас есть две проблемы.

Чтобы использовать собственный компаратор, вы должны указать тип компаратора в качестве третьего аргумента шаблона:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;

HeuristicList ret( DepthCompare ); интерпретируется как объявление функции, а не объявление переменной, давая ошибку, которую вы видите.Вам нужно передать экземпляр компаратора и убедиться, что он не может быть интерпретирован как объявление функции:

HeuristicList ret = HeuristicList(DepthCompare());

Однако, поскольку первый аргумент конструктора является необязательным, и по умолчанию он создается по умолчаниюкомпаратор, вы можете просто написать

HeuristicList ret;

или, поскольку вы просто возвращаете переменную сразу,

return HeuristicList();
0 голосов
/ 03 декабря 2010

Обратите внимание, что компаратор является третьим параметром шаблона priority_queue. Вы должны объявить свой priority_queue таким:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList;

Предполагается, что вы хотите использовать vector в качестве резервного контейнера (по умолчанию).

Также обратите внимание, что в функторе компаратора вы хотите объявить параметры как константную ссылку на указатель. У вас есть ссылка на указатель на const. Вы хотите это:

bool operator()(inst* const& lhs, inst* const& rhs) const

Вам также не нужно передавать экземпляр вашего объекта компаратора конструктору priority_queue, так как конструктор компаратора по умолчанию будет работать нормально.

...