【问题标题】:"Member function must be called or its address taken in function" C++ error“必须调用成员函数或其地址在函数中” C++ 错误
【发布时间】:2018-01-11 17:06:25
【问题描述】:

我正在C++ 中编写一个适用于线程的程序。当我尝试创建进程时,出现以下错误:Member function must be called or its address taken in function。这是我的代码:

void PCB::createProcess(){
    asm cli
    this->stack = new unsigned[stackSize];

    stack[stackSize-1] = 0x200;             
    stack[stackSize-2] = FP_SEG(wrapper);
    stack[stackSize-3] = FP_OFF(wrapper);
    this->ss = FP_SEG(stack+stackSize-12);
    this->sp = FP_OFF(stack+stackSize-12);

    asm sti
}


void PCB::wrapper(){

    myThread->run();

    myThread->state = TERMINATED;
}

我在这两行中得到错误:

stack[stackSize-2] = FP_SEG(wrapper);
stack[stackSize-3] = FP_OFF(wrapper);

我什么都试过了。 我试过(&(wrapper))PCB::wrapper&PCB::wrapper 并没有任何帮助,它只会给我更多的错误。 PCB 是类的名称。

如果有人有想法,请帮忙。

【问题讨论】:

    标签: c++ multithreading borland-c++ bcc-compiler


    【解决方案1】:

    FP_SEGFP_OFF 是分别从指针中提取段选择器和偏移量的宏。二十多年前,这就是我们在 DOS 和早期版本的 Windows 下操作指针的方式。除非你的目标是一些你没有提到的时髦系统,否则它们是完全不合适的。

    由于PCB::wrapper 是一个成员函数,指向它的指针就是一个指向成员函数的指针。它不是一个普通的函数,所以编译器抱怨它无法理解代码试图做什么是正确的。

    如今,多线程是使用std::thread 完成的。您不必进行那种 hacky 堆栈操作;只需将指向成员函数的指针和 this 指针传递给 std::thread 的构造函数即可。

    std::thread thr(&PCB::wrapper, this);
    

    【讨论】:

    • 我正在编写某种简单的操作系统内核。它应该从键盘注册中断并将按下的键显示到控制台。但我只是在开始。我实际上必须使用这些宏,因为我们使用的是 '92. C++ 和此类编译器的标准。
    • 那么您在问题中必须这样说。 C++ 没有 '92 标准——第一个 C++ 标准是 1998 年。无论如何:指向成员函数的指针不是指针,你不能把它当作一个指针。编写一个普通函数,并在对象上调用该成员函数。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多