質問: Boost.Proto Users' Guide を読んでいるのですが、そのなかの ``` typedef typename Context::template eval::result_type type; ``` という構文の意味が理解できずにいます。 C++ の typedef の引数は2つであると思っていたのですが、3つの場合がありうるのでしょうか? そうであるなら、どのような意味を持つのでしょうか? あるいは、typedefの引数は2つの場合しかないならば、上記構文の typename Context::template はどのような意味を持つと解釈すれば良いのでしょうか? 恥ずかしながら、typedef の使い方にをひととりおさらいしたつもりなのですが、上記構文の意味はわかりません。ヒントやtypedefについての解説へのURLだけでも助かりますので、どうか宜しくお願いいたします。
回答: 俗に「template限定子」と呼ばれる構文が使われており、そのせいでトークンが分割されてみえています。 ここでは`typename Context::template eval::result_type`型に`type`という別名を宣言しています。 ``` typedef typename Context::template eval::result_type type; ``` (余談ですが、typedefの引数という表現はあまり正確じゃない気はします。意味は通じますけど。) C++11言語仕様では [temp.names]/p4 に記載があります。 > > When the name of a member template specialization appears after `.` or `->` in a postfix-expression or after a nested-name-specifier in a qualified-id, and the object expression of the postfix-expression is type-dependent or the nested-name-specifier in the qualified-id refers to a dependent type, but **the name is not a member of the current instantiation (14.6.2.1), the member template name must be prefixed by the keyword `template`.** Otherwise the name is assumed to name a non-template. [ Example: > > > > ``` > struct X { > template X* alloc(); > template static X* adjust(); > }; > template void f(T* p) { > T* p1 = p->alloc<200>(); // ill-formed: < means less than > T* p2 = p->template alloc<200>(); // OK: < starts template argument list > T::adjust<100>(); // ill-formed: < means less than > T::template adjust<100>(); // OK: < starts template argument list > } > > ``` > > -- end example ] > > >