Изменение:
bool operator() (int i,int j) { return i<j; }
тоже:
bool operator() (int i,int j) const { return i<j; }
Есть два скрытых вопроса по вашему вопросу в комментариях:
1) Почему я должен добавить const к методу:
Вы должны использовать const, так как элементы объекта не изменены.
Создать правильные методы очень просто. Добавление const-корректности к методам после факта может стать настоящим ужасом, так как const все больше и больше проникает в вашу иерархию классов.
2) Почему при добавлении const к методу он компилируется.
Конструктор объекта, возвращаемого not2 (), принимает константную ссылку на ваш объект в качестве параметра. Это довольно распространенный метод, но он требует, чтобы все используемые вами методы также были постоянными.