2010-12-03 3 views
2

У меня есть функция, которая должна возвращать отсортированный список на основе некоторых входных параметров. Я выбрал std::priority_queue, чтобы сохранить этот список.Возврат 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 по линии возвращения инструкции.

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

ответ

5

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

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

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

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

HeuristicList ret = HeuristicList(DepthCompare()); 

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

HeuristicList ret; 

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

return HeuristicList(); 
+0

Спасибо. У меня есть намного больше чтения, чтобы все это понять. Исходя из Java, я несколько раз обходил анонимные объекты и думал, что C++ будет таким же. И, конечно, я оставил тело 'getHeuristicList()' для ясности, поэтому я не буду возвращать его немедленно. Мне нужно руководство по интерпретации сообщений об ошибках gcc! – Mike

0

Обратите внимание, что компаратор является третьим параметром шаблона 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 конструктора, поскольку конструктор по умолчанию компаратор будет делать только штрафом.

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