【问题标题】:Function Pointer - Compile time error函数指针 - 编译时错误
【发布时间】:2023-03-09 10:55:01
【问题描述】:

我是函数指针的新手,希望得到您的帮助。 我有一个方法:

int test3(int i)
{
    return i;
}

然后在另一种方法(不是主要)我做:

int (*pTest3)(int) = test3;

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

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

我不明白出了什么问题。任何帮助将不胜感激。

非常感谢。

【问题讨论】:

  • 该函数是类成员函数吗?该错误似乎表明它是......如果你想制作一个成员函数指针,它有点不同。
  • 这是正确的语法,肯定还有其他事情发生。你的编译器是什么?这段代码在什么范围内(即你不能在这里使用类函数)?
  • 没有错。从您的文件大小(至少 277 行)来看,可能还有其他原因导致此问题(CheckingConsumer ?)您没有在上面包含。
  • 如果您的问题中可以包含一个完整但最小的示例来显示您的问题,这将很有帮助。在这里,我们必须在字里行间大量阅读才能推断出test3 确实是CheckingConsumer 的成员,这使得问题比它需要的更难回答。
  • @Flexo:确切地说:真正发生的事情与 Op 的示例代码无关。

标签: c++ function-pointers pointer-to-member


【解决方案1】:

您的test3 是struct 或class 的成员函数。类成员函数有一个隐藏的this 参数传递给它们,因此不能与普通函数指针一起使用。您需要将该函数声明为static 或将其移出struct/class,使其不再具有隐藏的this 参数,或者使用类方法指针而不是函数指针:

// 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);

【讨论】:

  • 非常感谢您的回复。它使用 static 关键字工作。但是,这会影响程序吗?
  • @user1491620 static 使它不适用于您的类的实例,这大大改变了含义。
【解决方案2】:

您的方法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 个简单的指针和偏移量,具体取决于编译器和其他方面,如多重继承、虚拟基类的存在等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多