我正尝试使用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(未解析的重载 函数类型,int,int)'
我认为这意味着功能模板实际上并未实例化。
我错过了什么才能打通电话?
答案 0 :(得分:3)
问题是您尝试在没有对象的情况下调用 member 函数。有两种解决方案:
eval
标记为static
。创建一个Node
对象,并在该对象上创建std::invoke
eval
方法。看起来像这样:
int main()
{
Node n{};
std::cout << std::invoke(&Node::eval<int>, n, 1, 2);
return 0;
}
在这里,n
对象作为指向this
方法的eval
指针的对象传递。
答案 1 :(得分:2)
两个问题:
首先,您的函数模板使用一个类型参数,而不是两个。
其次,您的函数不是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;
}