キーワードtypenameの意味が分かりません。テンプレートを定義するときに
よく使われるようですが、なくても良いような気がします。例えば、
プログラミング言語C++のp.599にある bind2nd の定義のtypenameを取って
コンパイルしてみましたが、コンパイルが通って、テストコードがきちんと
動きました。typenameの存在意義を教えていただけないでしょうか。
こういう場合にtypenameがなければ困るという分かりやすい例が欲しいです。

// ----- プログラミング言語C++(p.599)より -----
template <class BinOp>
class my_binder2nd : public unary_function<BinOp::first_argument_type, BinOp::result_type> { // my_を付けて実験
protected:
BinOp op;
typename BinOp::second_argument_type arg2; // このtypenameを取ってみた。
public:
my_binder2nd(const BinOp& x, const typename BinOp::second_argument_type& v) // このtypenameも取った。
: op(x), arg2(v) {}
result_type operator()(const argument_type& x) const { return op(x, arg2); }
};

template<class BinOp, class T> my_binder2nd<BinOp> my_bind2nd(const BinOp& op, const T& v)
{
return my_binder2nd<BinOp>(op, v);