我想调用一个接收两个模板的方法,如以下代码:
template<class T>
class Test {
T t;
public:
Test(T v):t(v){}
template<class FUNC, size_t N>
T Func(FUNC&& fn) {
T v = 0;
for (size_t i = 0; i < N; i++)
v += fn(i);
return v;
}
};
int main(int argc, char **argv) {
Test<int> t(2);
auto l = [](size_t i) {return 2*i;};
int v = t.Func<decltype(l), 3>(l);
return 0;
}
但我收到了这个错误:
no matching function for call to ‘Test<int>::Func(main(int, char**)::<lambda(size_t)>&)’
int v = t.Func<decltype(l), 3>(l);
如何使用这样的方法?
答案 0 :(得分:4)
我建议你改变模板参数的顺序,让编译器自动推导出FUNC
类型。
像
template<size_t N, class FUNC>
T Func(FUNC fn) { ... }
并将其命名为
int v = t.Func<3>(l);
答案 1 :(得分:4)
您应该更改模板参数的顺序,以便只需要指定N
并且可以推导出FUNC
:
template <size_T N, class FUNC>
T Func(FUNC&& fn);
t.Func<3>(l);
如果您需要明确指定FUNC
,则它应为decltype(l)&
,以便参考折叠规则FUNC&&
变为decltype(l)&
并且可以绑定到左值{{} 1}}。如果您将l
指定为FUNC
而没有引用,则参数将变为decltype(l)
,无法绑定到左值。