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

Итак, у меня есть массив (0 - n), содержащий значения, которые я хочу использовать std :: set для его сортировки. Массив без знака 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 (стоимость) вызывает кучу ошибок, говоря такие вещи для каждого вызова члена набора:

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

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

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

1 Ответ

13 голосов
/ 21 ноября 2011

Самые-досадно-синтаксического анализа . Вам нужна другая пара скобок:

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

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

...