【发布时间】:2019-05-04 16:25:06
【问题描述】:
我尽可能地简化了问题,所以这里是有问题的函数:
class Test
{
public:
template<class T>
void ExecuteFunction(std::function<void(T)> f)
{
}
};
如果我使用 int 类型调用该函数,一切正常,但是,如果我使用 void 类型的 lambda 调用它,它将不再编译。
Test test;
test.ExecuteFunction<void>( // doesn't compile
[](void)->void
{
int i = 5;
});
test.ExecuteFunction<int>( // this compiles
[](int)->void
{
int i = 5;
});
编译器错误:
Error C2672 'Test::ExecuteFunction': no matching overloaded function found
Error C2770 invalid explicit template argument(s) for 'void Test::ExecuteFunction(std::function<void(P)>)'
Error (active) no instance of function template "Test::ExecuteFunction" matches the argument list
有没有办法解决这个问题?有人将如何指定模板以使两个调用都起作用?
【问题讨论】:
-
void不是可以传递给函数的参数类型。std::function<void(T)>只接受一个T类型的参数,而你的第一个 lambda 只接受零个参数 -
这里是相关提案P0146。如果您有时间花时间阅读,我想会很有趣:) 不过,不知道它的当前状态是什么。
标签: c++ c++11 templates lambda std-function