模板消歧器

con*_*ius 12 c++ templates ambiguity

我试图找到关于模板关键字的任何信息用作消除歧义,但没有任何相关信息.可能我正在搜索错误的关键字,但标准中没有.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>();
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Pra*_*rav 10

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

ISO C++ 03 14.2/4

当成员模板专业化的名称出现之后.或 - >在postfix-expression中,或在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须是以关键字模板为前缀.否则,假定该名称命名非模板.

PS:

如果没有额外使用模板,编译器就不会知道后面的less-than标记(<)实际上并不是"小于",而是模板参数列表的开头.

  • 可能我需要更改我的PDF阅读软件:)就在该文本后面有使用 - >模板的示例,我的软件无法找到.非常感谢.这就对了. (4认同)