C++ 使用std::invoke调用模板化函数
我试图使用std::invoke调用模板成员函数,如下面截取的代码所示C++ 使用std::invoke调用模板化函数,c++,function-pointers,c++17,member-function-pointers,C++,Function Pointers,C++17,Member Function Pointers,我试图使用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:
#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给出了错误
调用“invokeunresolved”时没有匹配的函数
函数类型,int,int'
我认为这意味着函数模板实际上没有实例化
要使调用成为可能,我缺少了什么?问题是您试图调用没有对象的成员函数。有两种解决方案: 将eval标记为static。 创建一个节点对象,并在该对象上调用eval方法。它看起来是这样的:
int main()
{
Node n{};
std::cout << std::invoke(&Node::eval<int>, n, 1, 2);
return 0;
}
在这里,n对象作为指向eval方法的指针的对象传递。问题是您试图调用没有对象的成员函数。有两种解决方案: 将eval标记为static。 创建一个节点对象,并在该对象上调用eval方法。它看起来是这样的:
int main()
{
Node n{};
std::cout << std::invoke(&Node::eval<int>, n, 1, 2);
return 0;
}
这里,n对象作为指向eval方法的指针的对象传递。两个问题:
首先,函数模板接受一个类型参数,而不是两个。
第二,你的函数不是静态的,因此你不能在没有对象的情况下使用它
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;
}
两个问题:
首先,函数模板接受一个类型参数,而不是两个。
第二,你的函数不是静态的,因此你不能在没有对象的情况下使用它
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需要一个节点对象来操作。您可以将eval标记为静态,这样就解决了问题。正如@MilesBudnek上面所说的-eval需要在一个节点对象上调用。@Lorand No,.eval需要一个节点对象来操作。您可以将eval标记为static,这样就解决了问题。正如@MilesBudnek上面所说的那样-需要在节点对象上调用eval。@Lorand No。