C++ lambda原因中的自动参数类型;使用';模板&x27;要处理的关键字…“;错误
我有这个密码C++ lambda原因中的自动参数类型;使用';模板&x27;要处理的关键字…“;错误,c++,templates,lambda,auto,C++,Templates,Lambda,Auto,我有这个密码 struct TestClass { 模板 不明白 { 返回0; } }; void调用(const std::function&func) { func(TestClass()); } 现在,如果我像下面那样使用invoke,就没有问题了 invoke([](TestClass tc){ tc.get(); }); 但是,如果我将lambda函数中的参数类型更改为auto,则会出现以下错误。我知道我可以通过在get之前插入template关键字来修复它,但我不明白为什么会出现
struct TestClass
{
模板
不明白
{
返回0;
}
};
void调用(const std::function&func)
{
func(TestClass());
}
现在,如果我像下面那样使用invoke
,就没有问题了
invoke([](TestClass tc){
tc.get();
});
但是,如果我将lambda函数中的参数类型更改为auto
,则会出现以下错误。我知道我可以通过在get
之前插入template
关键字来修复它,但我不明白为什么会出现此错误
error: use 'template' keyword to treat 'get' as a dependent template name
tc.get<int>();
^
template
// Happens when using `auto` as parameter type
invoke([](auto tc) {
tc.get<int>();
});
错误:使用'template'关键字将'get'视为从属模板名称
tc.get();
^
模板
//将“auto”用作参数类型时发生
调用([](自动tc){
tc.get();
});
我正在使用clang v10.0现在您有了一个模板类型(以
auto
的形式)而不是一个具体的类型TestClass
,因此get
函数是依赖的,因此您需要使用template
关键字限定它:
tc.template get<int>();
tc.template get();
可能相关:我不明白为什么auto
没有给出具体的类型。TestClass
不是参数唯一可能的类型吗?@PeterBechP lambda是可调用的,因为它编译成一个定义了operator()
的小类。当参数指定为auto
(通用lambda)时,生成的操作符()
的参数将成为模板参数。(因此operator()
是模板化的)。由于get
是一个模板化名称,编译器要求您通过插入template
关键字来消除表达式的歧义。这很有意义。谢谢!:-)