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
关键字来消除表达式的歧义。这很有意义。谢谢!:-)