我正在尝试使用std::invoke
调用模板化成员函数,如下面截取的代码所示。
#include <functional>
#include <iostream>
struct Node
{
template <typename T>
T eval(T lhs, T rhs) { return lhs + rhs; }
};
int main(void)
{
std::cout << std::invoke(&Node::eval<int>, 1, 2);
return 0;
}
GCC 8.1 给了我错误
没有匹配函数来调用'invoke(未解析的重载) 函数类型,整数,整型)'
我认为这意味着函数模板实际上没有实例化。
我错过了什么才能使通话成为可能?
两个问题:
首先,函数模板采用一个类型参数,而不是两个。
其次,你的函数不是static
的,因此你不能在没有对象的情况下使用它。
struct Node
{
template <typename T>
static T eval(T lhs, T rhs) { return lhs + rhs; }
^^^^^^
};
int main(void)
{
std::cout << std::invoke(&Node::eval<int>, 1, 2);
^^^
return 0;
}
问题是您尝试调用没有对象的成员函数。有两种解决方案:
- 马克
eval
饰演static
. -
创建一个
Node
对象,并在该对象上std::invoke
eval
方法。它看起来像这样:int main() { Node n{}; std::cout << std::invoke(&Node::eval<int>, n, 1, 2); return 0; }
在这里,n
对象作为指向eval
方法的指针this
的对象传递。