После исправления очевидных опечаток, то, что вам не хватало, было значением по умолчанию для параметра шаблона:
#include <deque>
#include <functional>
using std::deque;
using std::less;
bool mycomp(int a, int b) {return a<b;}
template< typename _Compare = std::less<int> >
void special_push (deque<int> & qu,int val, _Compare __comp = less<int>()) {
while(qu.empty()==false && __comp(val, qu.back())) {
qu.pop_back();
}
qu.push_back(val);
}
int main () {
deque<int> qu;
special_push(qu, 3);
special_push(qu, 5, less<int>());
special_push(qu, 5, mycomp);
}
В качестве альтернативы, вы могли бы использовать перегруженную функцию (это часто то, что libstdc ++ делает внутренне, ноЯ не знаю ни одной причины, чтобы сделать это таким образом.)
Обратите внимание, что есть также несколько стилистических или педантичных проблем, которые вы, вероятно, должны решить.