C++ 使用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:

我试图使用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给出了错误

调用“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。