【问题标题】:template disambiguator模板消歧器
【发布时间】:2011-05-03 21:21:09
【问题描述】:

我正在尝试查找有关用作消歧器的模板关键字的任何信息,但没有任何相关信息。可能我正在搜索错误的关键字,但标准中没有 .template 或 ->template 之类的东西。 Google 仅显示来自不同论坛的 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>();
}

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

谢谢。

【问题讨论】:

标签: c++ templates ambiguity


【解决方案1】:

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

ISO C++03 14.2/4

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

附注:

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

【讨论】:

  • 可能我需要更改我的 PDF 阅读软件 :) 在该文本之后有使用 ->template 的示例,但我的软件无法找到该示例。非常感谢。就是这样。
  • 标准这么说就没有别的原因了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多