我正在尝试查找有关用作消除歧义的模板关键字的任何信息,但没有任何相关信息。可能我正在搜索错误的关键字,但标准中没有.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>();
}
所以我的问题是:为什么这里使用模板关键字,没有那个关键字会有什么样的歧义?我在哪里可以阅读(我非常感谢链接到标准)。
感谢。
答案 0 :(得分:10)
简短回答:因为标准是这样说的
ISO C ++ 03 14.2/4
当成员模板专业化的名称出现之后。或 - &gt;在postfix-expression中,或者在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须以关键字模板。 否则,假定该名称命名为非模板。
P.S:
如果没有额外使用模板,编译器不会知道后面的小于令牌(<)
实际上并不是“小于”,而是模板参数列表的开头。