Boost.Proto Users' Guide を読んでいるのですが、そのなかの

typedef typename Context::template eval<Expr>::result_type type;

という構文の意味が理解できずにいます。
http://www.boost.org/doc/libs/1_57_0/doc/html/proto/users_guide.html#boost_proto.users_guide.back_end.expression_evaluation.proto_eval

C++ の typedef の引数は2つであると思っていたのですが、3つの場合がありうるのでしょうか?

そうであるなら、どのような意味を持つのでしょうか?
あるいは、typedefの引数は2つの場合しかないならば、上記構文の typename Context::template はどのような意味を持つと解釈すれば良いのでしょうか?

恥ずかしながら、typedef の使い方にをひととりおさらいしたつもりなのですが、上記構文の意味はわかりません。ヒントやtypedefについての解説へのURLだけでも助かりますので、どうか宜しくお願いいたします。