The big problem with template template parameters is that the argument you pass has to have exactly that many template parameters - defaults are not considered. (I believe this will be remedied by C++0x's template aliases, but I'm not entirely sure.)
Now add to that the fact that the standard library may give all their templates any number of template parameters, as long as all those beyond the standard-specified set are defaulted. For example, instead of making their safe STL depend on a preprocessor macro that's giving ABI-concerned people nightmares without end, Microsoft could have implemented it like this:
This would have been perfectly conforming, but would break any program that expected std::vector to match a template template parameter with two parameters.
template <typename _Ty, typename _Alloc = std::allocator<_Ty>, bool _Safe = _CRT_DEFAULT_SAFE_MODE>
class vector ...
Which is why there are no such programs, and template template parameters are in extreme disuse.
i wanted to make it explicitly clear that the contained type of the vector should be the same as the other function arguments
And for heaven's sake, give your code a little space to breathe.
template<class container, typename T>
void function(container& v, typename container::value_type& f)