Хорошо, посмотрите на свой код. Вы объявили функцию fncomp
, но действительно ли вы ее где-нибудь используете? Вы инициализируете fn_pt
с ним, но fn_pt
нигде не используется. Тебе это не кажется странным? Как вы ожидаете, что ваш testSet
объект узнает, что вы хотите, чтобы он использовал ваш fncomp
в качестве компаратора, если вы никогда не просите ваш объект set использовать эту функцию?
Вы объявили свой набор testSet
с обычным указателем на функцию типа bool(*)(A,A)
в качестве типа компаратора. Это тип компаратора. Теперь вам нужно передать фактическое значение компаратора в ваш заданный объект через параметр конструктора
set<A, bool(*)(A,A)> testSet(fn_pt);
или
set<A, bool(*)(A,A)> testSet(fncomp);
(Вам не нужен этот промежуточный указатель fn_pt
).
Вы забыли это сделать, и объект set использовал значение аргумента конструктора по умолчанию для компаратора, который в данном случае является нулевым указателем. Таким образом, каждый раз, когда ваш testSet
объект пытается сравнить два элемента, он выполняет вызов функции через нулевой указатель. Не удивительно, что он падает.