线程函数参数的前向声明不起作用

forward declaration for thread function argument is not working

我正在尝试为 class 编写一个示例程序,它将执行 RAII 并使用自身 this 指针调用线程。但是线程函数参数的数据类型被声明为前面的前向声明。 请查看示例程序 -

#include <iostream>
#include <thread>

using namespace std;

class test; // **forward declaration**

void thfunc (test *p) {
    cout << p->value << endl;
    return;
}

class test {
    public:
        int value;
        thread t1;
        test () {
            value = 100;
            t1 = thread(thfunc, this);
        }
        ~test() {
            t1.join();
        }
};

int main () {
    test * p = new test;
    delete p;
    return 0;
}

这是一个编译错误 -

fwd.cpp: In function 'void thfunc(test*)':
fwd.cpp:9:11: error: invalid use of incomplete type 'class test'
fwd.cpp:6:7: error: forward declaration of 'class test'

为了解决这个问题,我将线程函数设为 class -

的静态成员函数
class test {
    public:
        int value;
        thread t1;
        test () {
            value = 100;
            t1 = thread(thfunc, this);
        }
        ~test() {
            t1.join();
            cout << "Dtor" << endl;
        }
        **static** void thfunc (test *p) {
            cout << p->value << endl;
            return;
        }

};

这是正确的修复吗?我想将线程函数作为单独的库,但现在我必须将它们作为 class 的一部分。请建议。任何形式的 help/pointer/suggestions 将不胜感激。

使 thfunc 成为静态成员是正确的,因为它会起作用。如果你出于某种原因(有时有很好的理由)想要将它们分开,那么你仍然可以这样做。

这个函数只能在作为参数传递给std::thread之前声明:

#include <iostream>
#include <thread>

using namespace std;

void thfunc (class test *p);

class test {
    public:
        int value;
        thread t1;
        test () {
            value = 100;
            t1 = thread(thfunc, this);
        }
        ~test() {
            t1.join();
        }
};

void thfunc (test *p) {
    cout << p->value << endl;
    return;
}

int main () {
    test * p = new test;
    delete p;
    return 0;
}