关于c ++:template disambiguator

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 14.2/4

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.

附笔:

如果不额外使用模板,编译器就不知道后面的小于标记(<)不是真正的"小于",而是模板参数列表的开头。