在这个简单的例子中,我试图调用在EventQueue中模板化的F函数。带有可变参数的。
class EventQueue {
public:
EventQueue(int size) {}
void Dispatch() {}
template <typename F, typename... Args>
void Call(F func, Args... args) {
func(args...);
}
void DispatchForever() {}
};
class Example{
EventQueue eq;
public:
Example():eq(10){};
void Parse(){
// Do something useful
}
void TestRoutine(){
eq.Call(this,&Example::Parse);
}
};
int main(){
Example example;
example.TestRoutine();
return 0;
}
我得到了这个错误:
<source>: In instantiation of 'void EventQueue::Call(F, Args ...) [with F = Example*; Args = {void (Example::*)()}]':
<source>:25:33: required from here
<source>:9:9: error: 'func' cannot be used as a function
9 | func(args...);
| ~~~~^~~~~~~~~
我对此感到有点惊讶,对一些资源的任何帮助都会非常感谢。
发布于 2020-10-19 22:58:46
根据问题作者发布的代码,正确的代码可能如下所示:
struct Foo
{
template <typename F, typename... Args>
void Call(F&& func, Args&&...args) {
std::invoke(std::forward<F>(func), std::forward<Args>(args)...);
}
void Parse()
{
std::cout << "Parse\n";
}
};
发布于 2020-10-19 22:26:44
所以问题被解决了,这是由于调用站点的一个问题。@Yksisarvinen在评论中指出。
从…
queue.Call(this, &Skipper::Parse);
更改为
queue.Call([this]() { this->Parse(); });
https://stackoverflow.com/questions/64429255
复制相似问题