C++ 函数指针-编译时错误

C++ 函数指针-编译时错误,c++,function-pointers,pointer-to-member,C++,Function Pointers,Pointer To Member,我是新来的函数指针,我想你的帮助。 我有一个方法: int test3(int i) { return i; } 然后在另一种方法(非main)中,我执行以下操作: 从我读过的例子来看,这似乎还可以。 但是,我得到一个编译时错误: testFile.cpp:277:25:错误:类型为“int”的参数 ({anonymous}::CheckingConsumer::)(int)“与”int(*)(int)“不匹配” 我不明白怎么了。任何帮助都将不胜感激 非常感谢。您的test3是stru

我是新来的函数指针,我想你的帮助。 我有一个方法:

int test3(int i)
{
    return i;
}
然后在另一种方法(非main)中,我执行以下操作:

从我读过的例子来看,这似乎还可以。 但是,我得到一个编译时错误:

testFile.cpp:277:25:错误:类型为“int”的参数 ({anonymous}::CheckingConsumer::)(int)“与”int(*)(int)“不匹配”

我不明白怎么了。任何帮助都将不胜感激


非常感谢。

您的
test3
struct
类的成员函数。类成员函数有一个传递给它们的隐藏的
参数,因此不能与普通函数指针一起使用。您需要将函数声明为
静态
,或者将其移到
结构
/
之外,以便它不再具有隐藏的
参数,或者使用类方法指针而不是函数指针:

// static class method:
class X
{
    static int test3(int i)
    {
        ...
    }
};

// Non-class method, at global scope
int test3(int i)
{
    ...
}

// Class method pointer
class X
{
    int test3(int i)
    {
        ...
    }
};

// Create the method pointer
int (X::*pTest3) = &X::test3;
X *obj;
// Call the method pointer on an object
(obj ->* pTest3)(42);

您的
test3
struct
类的成员函数。类成员函数有一个传递给它们的隐藏的
参数,因此不能与普通函数指针一起使用。您需要将函数声明为
静态
,或者将其移到
结构
/
之外,以便它不再具有隐藏的
参数,或者使用类方法指针而不是函数指针:

// static class method:
class X
{
    static int test3(int i)
    {
        ...
    }
};

// Non-class method, at global scope
int test3(int i)
{
    ...
}

// Class method pointer
class X
{
    int test3(int i)
    {
        ...
    }
};

// Create the method pointer
int (X::*pTest3) = &X::test3;
X *obj;
// Call the method pointer on an object
(obj ->* pTest3)(42);

您的方法
test3
似乎是一个实例方法。稍后将
pTest3
定义为函数指针,而不是成员函数指针

简单指针和成员指针之间的主要区别在于,使用成员指针需要对象的实例。对象的实例告诉我们应该处理哪个对象,指针的值告诉我们应该使用对象的哪个数据字段,或者应该调用哪个成员函数。成员指针的值在概念上等同于从对象开始到其成员的偏移量

使用typedef声明成员指针:

typedef int (SomeClass::*MyMethodPtr)(int i);
MyMethodPtr ptr3 = SomeClass::test3;
现在使用此指针:

class SomeClass *pab = &ab;
int ret_value = (pab->*ptr3)(4);

请注意,使用了该类的实例。关于成员指针还有其他重要的一点。它们被实现为结构,内部包含2到5个简单指针和偏移量,具体取决于编译器和其他方面,如多重继承、虚拟基类的存在等。

您的方法
test3
似乎是一个实例方法。稍后将
pTest3
定义为函数指针,而不是成员函数指针

简单指针和成员指针之间的主要区别在于,使用成员指针需要对象的实例。对象的实例告诉我们应该处理哪个对象,指针的值告诉我们应该使用对象的哪个数据字段,或者应该调用哪个成员函数。成员指针的值在概念上等同于从对象开始到其成员的偏移量

使用typedef声明成员指针:

typedef int (SomeClass::*MyMethodPtr)(int i);
MyMethodPtr ptr3 = SomeClass::test3;
现在使用此指针:

class SomeClass *pab = &ab;
int ret_value = (pab->*ptr3)(4);

请注意,使用了该类的实例。关于成员指针还有其他重要的一点。它们被实现为结构,内部包含2到5个简单指针和偏移量,具体取决于编译器和其他方面,如多重继承、vitrual基类的存在等。

该函数是类成员函数吗?这个错误似乎表明它是。。。。如果你想做一个成员函数指针,它会有点不同。这是正确的语法,肯定还有其他的事情。你的编译器是什么?这段代码是在什么样的scoope中编写的(即,您不能在这里使用类函数)?它没有任何问题。从您的文件大小(至少277行)来看,可能还有其他原因导致了上述问题(
CheckingConsumer
?)。如果在您的问题中可以包含一个完整但最小的示例来说明您的问题,这将很有帮助。在这里,我们必须仔细阅读字里行间的内容,才能推断出
test3
确实是
CheckingConsumer
的一员,这使得问题比它需要的更难回答。@flex:确切地说:真正发生的事情与Op的示例代码无关。该函数是类成员函数吗?这个错误似乎表明它是。。。。如果你想做一个成员函数指针,它会有点不同。这是正确的语法,肯定还有其他的事情。你的编译器是什么?这段代码是在什么样的scoope中编写的(即,您不能在这里使用类函数)?它没有任何问题。从您的文件大小(至少277行)来看,可能还有其他原因导致了上述问题(
CheckingConsumer
?)。如果在您的问题中可以包含一个完整但最小的示例来说明您的问题,这将很有帮助。在这里,我们必须仔细阅读字里行间的内容,才能推断出
test3
确实是
CheckingConsumer
的一员,这使得问题比它需要的更难回答。@flex:确切地说:真正发生的事情与Op的示例代码无关。非常感谢您的回答。它使用static关键字工作。但是,这会影响程序吗?@user149162
static
使它不能与类的实例一起工作,这会显著改变其含义。非常感谢您的回复。它使用static关键字工作。但是,这会影响程序吗?@user149162
static
使其无法与类的实例一起工作,这会显著改变其含义。