我在这里找到了这个问题,但现在我想扩展它。所以我在一个文件中有以下类,它可以正常工作:
typedef int (*fptr)();
int f1() {
return 1;
}
int f2() {
return 2;
}
fptr f( char c ) {
if ( c == '1' ) {
return f1;
}
else {
return f2;
}
}
但是当我想在另一个文件中移动这些函数并从中创建一个工厂时,我得到一个我无法理解的错误。
就像这样:
部首:
public class Factories{
public:
int f1();
int f2();
}
CPPFile:
int f1() {
return 1;
}
int f2() {
return 2;
}
部首:
public class FactoryClass{
public:
fptr f( char c );
}
CPPFile:
typedef int (*fptr)();
fptr f( char c ) {
if ( c == '1' ) {
return Factories::f1;
}
else {
return Factories::f2;
}
}
这里在这个FactoryClass函数的返回中我得到错误"返回值类型与函数类型"不匹配。 任何想法都将不胜感激。
答案 0 :(得分:2)
Factories::f1
不是正常函数,它是成员函数。由于它是一个成员函数,因此需要指向调用它的对象,以便它可以影响该实例。这意味着成员函数的类型包括从中调用它的对象类型,因此指向f1
的指针实际上具有类型
int (Factories::*)()
您必须要fptr
typedef int (Factories::*fptr)();
或使函数static
成为常规函数。
答案 1 :(得分:1)
你要返回的成员函数Facotires :: f1只是签名错误。如果可能,使它们(f1和f2)静止。如果没有,请绑定相应的类实例(使用boost :: bind或std :: bind)
答案 2 :(得分:1)
将函数类型放入类中时,函数类型已更改。新类型应为typedef int (Factories::*fptr)();