以下代码在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扩展)
从标准:
14.6.2.1 依赖类型 [临时类型]
1如果是,则名称指的是当前实例化
__在类模板、类模板的嵌套类、类模板的成员或类模板的嵌套类的成员的定义中,类模板或嵌套类的injected-class-name(子句9),
名称 foo
指的是当前的实例化,这是显而易见的。
由于迭代器
在模板的定义中被声明为嵌套类,因此迭代器
引用当前 foo
实例化中的名称。foo::迭代器
与迭代器
相同。
using bar = foo::iterator;
以及
using bar = iterator;
应该管用。
在我看来,你似乎遇到了MSVC的缺陷。
[温度资源]/p3:
当限定id旨在引用不是当前实例化(14.6.2.1)成员的类型,并且其嵌套名称说明符引用依赖类型时,它应该以关键字< code>typename作为前缀,形成一个typename说明符。
[临时部门类型]/p1:
如果是,则名称引用当前的实例化
[temp.dep.type]/p4:
如果名称是当前实例化的成员,则为
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