我试图理解c ++的概念,因为我不是很先进。虽然我有血统知识,但我完全不知道这里发生了什么!
我正在创建一个程序,其中我只有一个带有指向函数的指针的template_class,它返回函数add的值。我使用Visual c ++,由于某种原因,它在main.cpp中返回以下错误: -
错误C3867' Template_class :: add&#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);
}
};
这可能是一个无效的问题(关于哪个我不知道),但正如我所说,我不是一个高级程序员,所以请建议我一些解决方案
答案 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);