template disambiguator
我试图找到任何关于模板关键字被用作消歧器的信息,但没有这方面的内容。我可能在搜索错误的关键字,但在标准中没有类似.template或->template的内容。谷歌只显示了来自不同论坛的GCC问题,但并没有真正解释它的用途。
这样的代码在没有template关键字的情况下无法编译到第11行(在gcc上),但我不确定这是否符合标准。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | template<typename B> struct S1 { template<typename T> void test() {} }; template<typename T> struct S2 { S2() { S1<T>().template test<int>(); } }; int main() { S2<int>(); } |
所以我的问题是:为什么这里使用template关键字,没有这个关键字有什么样的歧义,我在哪里可以读到它(我真的很感激链接到标准)。
谢谢。
简短回答:因为标准是这么说的
ISO C++03
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.
附笔:
如果不额外使用模板,编译器就不知道后面的小于标记