【发布时间】:2013-03-02 20:31:06
【问题描述】:
我有一个简单的模板类,它有两个函数指针和一个值。一个指针是比较运算符,另一个是对象(例如 getX())。
标题:
template<class T>
class A {
public:
A(T (*function)(), const bool (*op)(T,T),const T value) :
function(function), value(value), op(op){}
bool valid();
private:
T value;
T (*function)();
bool (*op)(T, T);
};
CPP:
#include "A.h"
template<class T>
bool A<T>::valid(){
return (op(function(),value));
}
所以如果你创建了一个 A 的实例:
A<float> a = A<float>(x->getX,operator==,20);
当valid被调用时,is相当于:
x->getX() == 20;
实际的标头/类定义工作正常。问题是在创建 A 的实例时;它不起作用。我认为这是因为 'x->getX' 但有办法做我想做的事吗?
谢谢。
编辑::
确切的编译器错误如下:
....\Classes\Objects\B.cpp:42: 错误:没有匹配函数调用'A::A(未解析的重载函数类型,未解析的重载函数类型,float)' ....\Classes\Objects/A.h:30:注意:候选者是:A::A(T ()(), const bool ()(T, T), T) [with T = 浮动] ....\Classes\Objects/A.h:26:注意:A::A(const A&)
请注意:'x->getX' 返回一个浮点数
【问题讨论】:
-
“不起作用”是什么意思?
-
函数指针不是函子。仿函数是一个重载
operator()的类。 -
更改为函数指针。 “不起作用”是指在创建 A 的实例时它无法编译。
-
粘贴确切的编译器错误。
-
getX是某个类的方法。x是该类的一个对象。您不能将x.getX作为指向正常函数的指针传递。它在 C++ 中不起作用,就像 C# 中的委托一样。我能想到的最简单的方法是制作一个包装器,以获得你想要的结果。在 C++ 中必须有一些惯用的方法,但你需要知道该语言的人来告诉你。
标签: c++ function-pointers