C++ 将结构类型的地址传递给boost::thread?

C++ 将结构类型的地址传递给boost::thread?,c++,pointers,struct,boost-thread,C++,Pointers,Struct,Boost Thread,使用Boost 1.43线程,可以编译以下内容: void MyClass::threadFn(...) { ... } void MyClass::doFn(...) { ... boost::thread(&MyClass::threadFn, this, ...); } void MyClass:doFn(...) { ... struct MyStruct { MyStruct(...) { ... }; } b

使用Boost 1.43线程,可以编译以下内容:

void MyClass::threadFn(...) { ... }
void MyClass::doFn(...) {
    ...
    boost::thread(&MyClass::threadFn, this, ...);
}
void MyClass:doFn(...) {
    ...
    struct MyStruct {
        MyStruct(...) { ... };
    }

    boost::thread(&MyStruct, ...);
}
但以下内容不可编译:

void MyClass::threadFn(...) { ... }
void MyClass::doFn(...) {
    ...
    boost::thread(&MyClass::threadFn, this, ...);
}
void MyClass:doFn(...) {
    ...
    struct MyStruct {
        MyStruct(...) { ... };
    }

    boost::thread(&MyStruct, ...);
}
这将产生“MyClass::doFn::MyStruct”:非法使用此类型作为表达式。请注意,我没有试图传递指向
MyStruct
实例的指针;我试图传递类型本身,就像传递函数指针一样,以便
boost::thread
调用类型的构造函数

根据:

通过传递可调用类型的对象来启动新线程

那么,如何将
struct
类型的地址传递给
boost::thread
函数(这也适用于
boost::bind

而不是:

boost::thread(&MyStruct, ...);
调用实例:

boost::thread(MyStruct(), ...);

我不确定它的用途是什么,但下面将调用
MyStruct()


MyStruct不是可调用类型。您需要定义一个在MyStruct上运行的函数,然后使用该函数来实例化线程

线程是一个执行上下文,要实例化它,需要一组指令才能执行

在Java中,我们以Runnable的形式看到这一点,Runnable用于实例化线程,线程可以是
start()
ed

在带Boost的C/C++中,必须使用函数指针

术语“可调用类型”大致翻译为“可与函数指针交换的类型”

如果要对任意结构进行操作,如您的示例中所示,
MyStruct
,首先必须定义一组对该类型进行操作的指令(函数)

一旦知道了指令集,就可以传递一个指向该函数的指针来初始化线程,然后使用MyStruct的任意实例运行该线程

代码如下:

struct MyStruct {
        MyStruct(...) { ... }
    };

int frobnicateMyStruct( const MyStruct& msr ) {

    /* some operations on msr */

    return 0;
}    

void foo() {

    MyStruct myStructInstance;
    boost::thread(&frobnicateMyStruct, myStructInstance);

    /* ... */

    return;
}

MyStruct不是可调用类型。您需要定义一个在MyStruct上运行的函数,然后使用该函数来实例化线程。此外,您缺少一个分号,
MyStruct
甚至不在所需行的范围内。@user931794:我该怎么做?我无法在函数中实例化MyStruct,因为MyStruct执行的操作需要在新线程中启动。@KerrekSB:Edited以包含分号;
MyStruct
如何不在所需行的范围内?编译器认为它是,并将其识别为无效类型。(实际的代码远比这个复杂——本例中的拼写错误实际上不是来自我的代码。)@taz:哦,对不起,这是真的——它在范围内,但它是一个本地类。在C++03中,这些不能是模板参数。这仍然需要调用
MyStruct
。i、 e.
(MyStruct())()
注意,我并不是试图传递指向MyStruct实例的指针;我试图传递类型本身,就像传递函数指针一样,这样boost::thread将调用类型的构造函数。
@taz-函数指针不是类型。无法将类型传递给
boost::thread
。您可以编写一个函数来构造
MyStruct
对象,并传递该函数。感谢这些修复。我喜欢在我的代码中有汽车来提醒我他们的存储类,但我知道你为什么要把它们拿出来。