我在使用函数指针方面遇到了一些困难。我有一个基类定义了一个函数指针,通过 typedef double(* function)(double * x)const;
一个快速的问题:为什么上面的typedef不能编译?
给出以下错误:错误:'const'和'volatile'函数 'function'上的说明符在类型声明中无效
对于下面的部分,我使用 typedef double(* function)(double * x)。 现在每个子类都可以实现这种类型的多个不同版本的函数。通过枚举我选择我选择的函数,它将我的非成员函数指针(在基类中定义)设置为由子类的这些成员函数指针之一初始化。这是一段代码:
女儿类的源文件:
PndLmdROOTDataModel1D::PndLmdROOTDataModel1D(interpolation_type intpol_type) {
if(intpol_type == CONSTANT) {
setModelFunction(&PndLmdROOTDataModel1D::evaluateConstant);
}
else if (intpol_type == SPLINE) {
setModelFunction(&PndLmdROOTDataModel1D::evaluateSpline);
}
else {
setModelFunction(&PndLmdROOTDataModel1D::evaluateLinear);
}
}
基类(头文件):
class MultiModel1D: public Model1D {
protected:
function model_func;
public:
MultiModel1D();
virtual ~MultiModel1D();
void setModelFunction(function f);
}
编译时出现以下错误:
注意:参数1中没有已知的转换来自'double (PndLmdROOTDataModel1D :: *)(double *)'to'function {aka double (*)(*双)}”
我正在使用函数指针,因为速度问题(至少我认为这应该比不断运行某些开关案例更快)。我究竟做错了什么?也许还有一些设计模式可以作为更好的选择...提前谢谢!
史蒂夫
答案 0 :(得分:11)
这是因为(free-)函数指针和成员函数指针之间存在根本区别。你的“问题”已经包含了问题的提示。要解释一下,你可以这样做:
typedef double (SomeClass::*function)(double *x) const;
或
typedef double (*function)(double *x);
但是在函数级别上永远不能声明非成员函数const
。这些类型无法相互转换,这是编译器指出的代码中的问题。
如果他们可以转换,你最终会遇到一个问题:成员函数指针告诉编译器它需要一个被调用的对象,它将被放入{{1}当调用成员函数时。如果指针可以转换为普通函数指针,则该对象将丢失,并且可能所有参数都会因此而混乱。所以,不,你真的不能只是投他们。现实更加复杂(多重/虚拟继承),但你得到了图片......
答案 1 :(得分:7)
出于同样的原因,我们不会写:
void foo() const
{
// ...
}
在类声明之外。非会员功能不能是const
。
你的函数指针是一个普通的函数指针,而不是指向成员函数的指针,因此,const
没有意义。