12

我正在尝试查找有关用作消歧器的模板关键字的任何信息,但对此一无所知。可能我正在搜索错误的关键字,但标准中没有 .template 或 ->template 之类的东西。谷歌只显示来自不同论坛的 GCC 问题,但并没有真正解释它的用途。

像这样的代码在第 11 行(在 GCC 上)没有模板关键字就无法编译,但我不太确定这是否符合标准。

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>();
}

所以我的问题是:为什么在这里使用模板关键字,没有那个关键字会有什么样的歧义,我在哪里可以阅读(我真的很感激链接到标准)。

谢谢。

4

1 回答 1

10

简短的回答:因为标准是这样说的

ISO C++0314.2/4

当成员模板专业化的名称出现在 . 或 -> 在后缀表达式中,或在限定标识符中的嵌套名称说明符之后,并且后缀表达式或限定标识符显式依赖于模板参数(14.6.2),成员模板名称必须是以关键字模板为前缀。否则,该名称被假定为命名一个非模板

PS:

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

于 2010-11-02T11:27:50.873 回答