Getting error : C3867 'Template_class<int>::add': non-standard syntax; when using pointers to functions with templates

Getting error : C3867 'Template_class<int>::add': non-standard syntax; when using pointers to functions with templates

我正在尝试理解 C++ 的概念,因为我对它的了解不是很深。虽然我有血统知识,但我完全不知道这里发生了什么!!!

我正在制作一个程序,其中我只有一个 template_class 和一个指向函数的指针,returns 函数的值相加。我正在使用 Visual C++,由于某种原因 returns main.cpp 中出现以下错误:-

Error C3867 'Template_class::add': non-standard syntax; use '&' to create a pointer to member`

main.cpp

#include<iostream>
#include<string>
#include"Template_class.h"

using namespace std;

int main()
{
    Template_class <int> t;

    t.retrunOperation(4, 5, t.add);
    cin.get();
}

Template_class.h

#include<iostream>

template<class T>
class Template_class
{
public:
    Template_class()
    {

    }
    ~Template_class()
    {

    }

    T add(T var1 , T var2)
    {
        return var1 + var2;
    }

    void  retrunOperation(T var1 , T var2 , T (*function)(T , T))
    {
        std::cout << (*function)(var1, var2);
    }
};

这可能是一个无效的问题(我对此一无所知),但正如我所说,我不是高级程序员,所以请给我一些解决方案建议

void  retrunOperation(T var1 , T var2 , T (*function)(T , T))

function 参数需要一个函数指针。

(常规)函数指针不能指向 non-static 成员函数。 Template_class::add 是一个 non-static 成员函数。因此它不能被函数指针指向。

最简单的解决方案是使用 static 关键字将 Template_class::add 声明为静态成员函数。静态成员函数可以由函数指针指向。


非成员函数的名称将隐式衰减为指向该函数的指针,而无需使用 addressof 运算符 (&)。非静态成员函数可以由成员函数指针指向,成员函数指针不可转换为(常规)函数指针。但是,非静态成员函数的名称不会隐式衰减为成员函数指针。这就是错误消息告诉您的内容。如果您通过添加 addressof 运算符解决了这个问题,那么您将收到另一个关于缺少拟合重载的错误。

编译器错误告诉你传递成员函数的正确方法是

t.retrunOperation(4, 5, &Template_class<int>::add);

然而,当你修复它时,你会发现 retrunOperation() 想要一个指向 function 的指针而不是指向 member function。然后,您需要将 add 设为静态:

static T add(T var1 , T var2)
{
    return var1 + var2;
}

或(不太可能)将 retrunOperation() 声明为采用指向成员函数的指针:

void  retrunOperation(T var1 , T var2 , T (Template_class<int>::*function)(T , T))

并适当实施。

Non-static 成员函数具有签名:

Ret Class::name(Type, Type2...);

指向成员函数的指针将如下所示:

Ret Class::* name(Type, Type...);

所以当你说:

t.retrunOperation(4, 5, t.add);

您正在尝试给予

int(*function)(int, int)

其中

int(Template_class<int>::*function)(int , int)

符合预期。

应用以上内容,您的特定问题的解决方案如下所示:

template<class T>
class Template_class
{
public:
    T add(T var1 , T var2) { return var1 + var2; }

    void  retrunOperation(T var1 , T var2 , T(Template_class<T>::*function)(T , T)) {}
};

你可以这样称呼它:

t.retrunOperation(4, 5, &Template_class<int>::add);