由于一些重要原因,我为微控制器编写了简单的std :: function模拟。当我尝试测试我的代码时,出现了问题,我的编译器给出了一些关于')'和','等等。原因是使用关键字decltype。我查看了Meyers显示的decltype返回的类型。然后我改变了" decltype(...)"到类型decltype扣除,一切顺利。我在各种GCC版本的编译器资源管理器中检查了我的代码,一切都是一样的。
这是带有decltype的代码(第102行): https://godbolt.org/g/4xBkSP 这里写的是完整类型的相同代码(同一行): https://godbolt.org/g/Er9dFk
有人可以解释一下,我们有什么事吗?
答案 0 :(得分:2)
显然,在decltype
情况下,编译器会将t
的类型视为依赖类型。因此你必须使用
t.template bind< typename Deref<decltype( *this )>::Type,
decltype( &TemplateClassWithCallback::foo3 ),
&TemplateClassWithCallback::foo3 >( *this );
语法引用成员模板bind
。请注意template
之前的额外关键字bind
。
如果明确指定t
的类型,则不会将其视为依赖类型。
但是,根据14.6.2.2/5,此类成员访问表达式不应被视为具有依赖类型,因为它引用具有非依赖性的当前实例化的成员类型。然而,GCC和Clang同意在这种情况下要求template
关键字。 (如果使用Clang编译它,它实际上会明确告诉您添加template
关键字。)