gl5_progのメモ

自分のためのメモとかまとめとか

->templateという書き方

p->IsActiveState<AAA>();

みたいなコードを書いたところ、

エラー: use 'template' keyword to treat 'IsActiveState' as a dependent template name

こんなエラーが出てしまいました。
なんかtemplateキーワードを使えと言われてる気がしたので、

p->template IsActiveState<AAA>();

こんな感じに書き換えてみたところエラーがなくなりました。
何この書き方、見たこと無いぞ。
というわけで少しググってみたところstackoverflowにありました。
c++ - Confusing Template error - Stack Overflow

When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.

postfix-expressionでテンプレートメンバ特化名が「.」or「->」の後に現れた場合、メンバーテンプレート名の前にtemplateキーワードを置かなければならない。そうしない場合、その名前は非テンプレートとみなされる。( すごい適当訳 )

postfix-expressionってtemplateクラスとかtemplate関数内のこと?
とりあえず、テンプレート引数のメンバテンプレート関数を呼び出す場合は「.template」や「->template」みたいにtemplateキーワードを置いておけということだと理解。

テンプレート引数に「::」使うにはtypenameが必要というのと似たようものだね。


おまけ( 再現コード )
http://ideone.com/iWh4E2