жаль, попробовал встроить s в T, как-то вроде еще кривее получилось:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <vector>
using std::vector;
template<class T> void swap(T& a,T& b){
	T t=a;
	a=b;
	b=t;
}
template<class T> void heapify(T& v,size_t i) {
//	if(!s) s=v.size()-1;
	if(i*2>v.s) return;
	if(i*2==v.s) { 
		if (v[i]<v[i*2]) swap(v[i],v[i*2]);
		return;
	}
	size_t max=i*2;
	if(v[max]<v[max+1]) max++;
	if(v[i]<v[max]) {
		swap(v[i],v[max]);
		heapify(v,max);
	}
}
template<class T> void make_heap(T& v){
	v.s=v.size()-1;
	for(size_t i=v.s/2;i>0;i--) heapify(v,i);
}
template<class T> void heap_sort(T& v) {
	//T& n=*(new T);
	//while(v.size()>0);
//	v.s=v.size()-1;
	make_heap(v);
	while(v.s>1) {
		swap(v[1],v[v.s--]);
		heapify(v,1);
	}
	return ;
}
template<class  T> class heap_vector: public vector<T> {
	public:
	size_t s;
	heap_vector(size_t ss=0):s(ss){
		this->push_back(0);
	}
};
int main(){
	while(cin) {
		//vector<int> vi;
		heap_vector<int> vi;
		int i=0;
		while(cin>>i && i) vi.push_back(i);
//		make_heap(vi);
		heap_sort(vi);
		for(size_t i=0;i<vi.size();i++) cout<<vi[i]<<"\t";
		cout<<endl;
		vi.clear();
	}
}
может как-то можно избежать вставления в vector еще 1й переменной?
такой синтаксис подойдет для возвращения ссылки на итератор?
T& n=*(new T);