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);
我正在尝试理解 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);