当前位置: 首页 > 知识库问答 >
问题:

C 11使用-declaration允许/需要“typename”吗?

胡安怡
2023-03-14

以下代码在g和clang中正确编译:

template<typename T>
struct foo
{
    class iterator;
    using bar = foo::iterator;
};

int main() {}

然而,MSVC 2013给出了以下错误:

foo.cpp(9): error C2061: syntax error : identifier 'iterator'
          foo.cpp(10) : see reference to class template instantiation 'foo<T>' being compiled
foo.cpp(9): error C2238: unexpected token(s) preceding ';'

如果我将该行更改为:

using bar = typename foo::iterator;

然后三个编译器都编译成功了。原始版本正确吗?(即这是MSVC错误,还是gcc/clang扩展)

共有2个答案

后易安
2023-03-14

从标准:

14.6.2.1 依赖类型 [临时类型]

1如果是,则名称指的是当前实例化

__在类模板、类模板的嵌套类、类模板的成员或类模板的嵌套类的成员的定义中,类模板或嵌套类的injected-class-name(子句9),

名称 foo 指的是当前的实例化,这是显而易见的。

由于迭代器在模板的定义中被声明为嵌套类,因此迭代器引用当前 foo 实例化中的名称。foo::迭代迭代器相同。

using bar = foo::iterator;

以及

using bar = iterator;

应该管用。

在我看来,你似乎遇到了MSVC的缺陷。

颜举
2023-03-14

[温度资源]/p3:

当限定id旨在引用不是当前实例化(14.6.2.1)成员的类型,并且其嵌套名称说明符引用依赖类型时,它应该以关键字< code>typename作为前缀,形成一个typename说明符。

[临时部门类型]/p1:

如果是,则名称引用当前的实例化

  • 在类模板的定义中,类模板的嵌套类、类模板的成员或类模板的嵌套类的成员,类模板或嵌套类的注入类名称(第9条),
  • […]

[temp.dep.type]/p4:

如果名称是当前实例化的成员,则为

  • 一个非限定名称,在查找时,它至少引用一个类的一个成员,该成员是当前实例化或其非依赖基类。[ 注意:这只能在类模板定义所包含的作用域中查找名称时发生。
  • 一个限定 id,其中嵌套名称说明符引用当前实例化,并且在查找时,至少引用作为当前实例化的类的一个成员或其非依赖基类。[ 注意:如果未找到此类成员,并且当前实例化具有任何依赖基类,则限定 ID 是未知专用化的成员。
  • [...]

foo 是当前实例化。foo::迭代器是一个限定id,其中嵌套名称说明符(foo::)引用当前实例化,并且当查找时,“引用类的至少一个成员是当前实例化或其非依赖基类”;因此,它是当前实例化的成员。因此,[温度.res]/p3 不适用,并且不需要类型名。您仍然可以添加一个 - 或者只是直接使用不合格的迭代器

 类似资料:
  • 问题内容: 我最近重新创建一个版本的月球着陆器在Python 3和pygame的(要知道,老复古游戏):我的着陆器移动()一起由于重力的y轴每一帧\。 问题: 在我达到1 m / s之前,添加到rect.move的y值是一个小于1的浮点数,因为pygame不喜欢浮点数,所以我必须使用它对它进行四舍五入。 在Tkinter的先前版本中,着陆器的y坐标是这样的: 在pygame中 这真的很烦人,因为运

  • 我想在MySQL中允许零日期。我已将更改为。 我已经在中更改了它。 然而,当我尝试插入数据时,我得到了错误, 数据截断:不正确的datetime值:“0000-00-00 00:00:00” MySQL版本为5.7.18。 这方面的任何想法都将大有帮助。

  • 在我的主干道上。飞镖 有人能帮我做这个吗? 非常感谢您抽出时间

  • 我们正在使用SetExpressCheckout代表第三方处理付款。即使第三方没有授予我们权限,它似乎也能正常工作。我们这样做正确吗? 据我所知,要为第三方处理支付,第三方应该使用工具 如果第三方PayPal帐户只是个人帐户(而不是企业帐户),则无法选择授予 API 权限 即使非商业第三方PayPal帐户未授予此权限,我们仍然可以将付款记入其帐户。 所以问题是,第三方是否真的有必要授予我们这种许可

  • 问题内容: 我正在尝试在表格中添加序列号。这是我的方法: 为什么此方法给我一个错误,而我的结果集已设置为可更新。我正在使用derby数据库。 问题答案: 根据Derby文档,带有的查询不可更新: 只有简单的单表SELECT游标才可以更新。可更新ResultSet的SELECT语句与可更新游标的SELECT语句具有相同的语法。生成可更新的游标: 该语句不能包含子句。 基础查询必须是SelectExp