获取错误:C3867&#39; Template_class <int> :: add&#39 ;:非标准语法;当使用带模板的函数指针时

时间:2017-01-19 16:45:16

标签: c++ templates function-pointers

我试图理解c ++的概念,因为我不是很先进。虽然我有血统知识,但我完全不知道这里发生了什么!

我正在创建一个程序,其中我只有一个带有指向函数的指针的template_class,它返回函数add的值。我使用Visual c ++,由于某种原因,它在main.cpp中返回以下错误: -

  

错误C3867&#39; Template_class :: add&#39 ;:非标准语法;使用&#39;&amp;&#39;创建指向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);
    }
};

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

3 个答案:

答案 0 :(得分:0)

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

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

(常规)函数指针不能指向非静态成员函数。 Template_class::add是一个非静态成员函数。因此,函数指针不能指向它。

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

非成员函数的名称将隐式地衰减为指向函数的指针,而不使用addressof运算符(&)。非静态成员函数可以由成员函数指针指向,它们不能转换为(常规)函数指针。但是,非静态成员函数的名称不会隐式衰减为成员函数指针。这就是错误消息告诉你的内容。如果你通过添加addressof运算符来修复它,那么你会得到另一个关于缺少拟合过载的错误。

答案 1 :(得分:0)

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

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

但是,当您修复此问题时,您会发现retrunOperation()想要一个指向功能的指针,而不是指向成员函数的指针。然后,您需要使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))

并妥善实施。

答案 2 :(得分:0)

非静态成员函数具有签名:

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);