Почему я не могу построить std::set с экземпляром предиката, но я могу назначить std::set, построенный таким образом?

Итак, у меня есть массив (0 - n), содержащий значения, которые я хочу использовать для сортировки std::set. Массив unsigned int стоимостью[n].

Я использую следующий функтор для этой сортировки:

struct ProxySorter {
  ProxySorter(const unsigned* arr) : proxy_array(arr) {}
  bool operator()(const unsigned& a, const unsigned& b) const {
    return proxy_array[a] < proxy_array[b];
  }
  const unsigned* proxy_array;
};

Так вот в чем проблема... Когда я создаю множество, это законно:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost));

Я не получаю ошибок, и все работает так, как ожидалось. Но это кажется взломанным и небрежным.

, это очевидно незаконно:
std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost));

попытка просто построить его с помощью ProxySorter (cost) вызывает кучу ошибок, говоря такие вещи для каждого вызова члена набора:

ошибка: запрос на стирание элемента в node_queue, который имеет неклассовый тип std:: set(прокси-сервер)

в чем проблема с обычным строительством? Почему работа? Какая разница, что я упускаю? Любая помощь значительно ценю, спасибо.

О, и извините за название вопроса, я не был уверен, как это назвать.

1 ответов


самый неприятный-разбора. Вам нужна еще одна пара скобок:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost)));

иначе он будет интерпретироваться как объявление функции, возвращающей ваш тип набора и принимающей аргумент типа ProxySorter имени cost.