I'm trying to implement a standard deviation routine using templates but I hit a snag with the bind2nd operator and I just don't get it:

I'm calling it with a vector of doubles and the error I get is:Code:template<typename T> struct minus_squared : public std::binary_function<T, T, T> { T operator()(const T& t1, const T& t2) const { return pow(t1 - t2, 2); } }; template<typename S, template <typename T> class Container> double sd(const Container<S>& ct) { double m = mean(ct); return sqrt(std::accumulate(ct.begin(), ct.end(), 0.0, std::bind2nd(minus_squared<S>(), m)) / (ct.size() - 1)); }

meaning obviously that "binder2nd" is expecting only one argument but is getting two arguments. What I don't understand is why?Code:/usr/include/c++/4.0.0/bits/stl_numeric.h: In function ‘_Tp std::accumulate(_InputIterator, _InputIterator, _Tp, _BinaryOperation) [with _InputIterator = __gnu_cxx::__normal_iterator<const double*, std::vector<double, std::allocator<double> > >, _Tp = double, _BinaryOperation = std::binder2nd<tlin::minus_squared<double> >]’: named_matrix.h:145: instantiated from ‘double tlin::sd(const Container<S>&) [with S = double, Container = std::vector]’ schone.cpp:14: instantiated from here /usr/include/c++/4.0.0/bits/stl_numeric.h:116: error: no match for call to ‘(std::binder2nd<tlin::minus_squared<double> >) (double&, const double&)’ /usr/include/c++/4.0.0/bits/stl_function.h:439: note: candidates are: typename _Operation::result_type std::binder2nd<_Operation>::operator()(const typename _Operation::first_argument_type&) const [with _Operation = tlin::minus_squared<double>] /usr/include/c++/4.0.0/bits/stl_function.h:445: note: typename _Operation::result_type std::binder2nd<_Operation>::operator()(typename _Operation::first_argument_type&) const [with _Operation = tlin::minus_squared<double>]