Вы вызываете свой компаратор здесь:
if (Cmp(fArray[idx], fArray[getParent(idx)])
Cmp
- ваш класс компаратора.Это параметр шаблона, который вы указываете в качестве Comparator
экземпляра шаблона.
Теперь отложим тему шаблонов на данный момент.Для всех практических целей Cmp
является классом здесь.Представьте, что это обычный, простой класс:
class Cmp {
// ...
};
Теперь спросите себя, что бы означало выражение:
Cmp(fArray[idx], fArray[getParent(idx)])
, тогда?
Это значит, конечно: создайте временный экземпляр класса Cmp
и передайте два параметра конструктору Cmp
.
Теперь вы должны понять свою проблему.Ваш класс компаратора не имеет конструктора, который принимает два параметра.Это то, что говорит вам ваш компилятор.
Вместо этого ваш класс компаратора имеет перегруженный оператор ()
.
В вашем случае не имеет смысла создавать временный объект.Ваша очевидная цель здесь - смоделировать шаблон Heap
и использовать его аналогично тому, как контейнеры стандартной библиотеки C ++ используют классы компараторов.
То, что фактически делают контейнеры стандартной библиотеки C ++, грубо говоря, заключается в том, чтоони объявляют член класса, который является экземпляром класса компаратора, а затем вызывают перегрузку оператора ()
члена класса.
Это свободно переводит в ваш Heap
шаблон, объявляющий член частного класса:
private:
Cmp cmp;
И затем вызывая перегрузку оператора ()
этого члена класса.
if (cmp(fArray[idx], fArray[getParent(idx)])
Также обратите внимание, что стандартные контейнеры библиотеки C ++ обычно имеют перегруженный конструктор, который принимает явный экземпляр класса компаратора, изатем использует его для копирования-конструирования своего частного экземпляра компаратора.