从类成员函数构造std :: thread

时间:2018-06-18 11:21:37

标签: c++ class visual-c++ stdthread

我想在updateThread

中使用updateWorldLoop()构建World::World()

Chunk.h

class World
{
public:
    static constexpr Chunk::Position renderSize = 10;

    World();

    //render chunks
    void draw();
    void drawDebug();

    void enableUpdateThread();
    void disableUpdateThread();

    void updateWorldLoop();
private:
    std::thread updateThread;
    bool updateThreadShouldClose;

    std::list<Chunk*> *frontDrawBuffer;
    std::list<Chunk*> *backDrawBuffer;
    std::list<Chunk*> unloadBuffer;

    void loadChunk(Chunk::PosVec position);
};

Chunk.cpp

World::World() :
    frontDrawBuffer(new std::list<Chunk*>), 
    backDrawBuffer(new std::list<Chunk*>), 
    unloadBuffer(),
    updateThread(updateWorldLoop) 
    //ERROR: non-standard syntax; use '&' to create a pointer to member
{ /*Initialize textures*/}

我做了一些研究并尝试了几种方法。他们都没有工作。

updateThread(&updateWorldLoop);
//ERROR: '&': illegal operation on bound member function expression

updateThread(this->updateWorldLoop);
//ERROR: non-standard syntax; use '&' to create a pointer to member

updateThread(&this->updateWorldLoop);
//ERROR: '&': illegal operation on bound member function expression

updateThread(World::updateWorldLoop);
//ERROR: non-standard syntax; use '&' to create a pointer to member

updateThread(&World::updateWorldLoop);
/***ERROR:
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(240): error C2672: 'std::invoke': no matching overloaded function found
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(248): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0>(std::tuple<void (__cdecl World::* )(void)> &,std::integer_sequence<_Ty,0>)' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<std::tuple<void (__cdecl World::* )(void)>>>,
1>            _Ty=::size_t
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(247): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Execute<0>(std::tuple<void (__cdecl World::* )(void)> &,std::integer_sequence<_Ty,0>)' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<std::tuple<void (__cdecl World::* )(void)>>>,
1>            _Ty=::size_t
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(244): note: while compiling class template member function 'void std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *) noexcept'
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<std::tuple<void (__cdecl World::* )(void)>>>
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(232): note: see reference to function template instantiation 'void std::_LaunchPad<_Target>::_Run(std::_LaunchPad<_Target> *) noexcept' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<std::tuple<void (__cdecl World::* )(void)>>>
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(259): note: see reference to class template instantiation 'std::_LaunchPad<_Target>' being compiled
1>        with
1>        [
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<std::tuple<void (__cdecl World::* )(void)>>>
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thread(49): note: see reference to function template instantiation 'void std::_Launch<std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<_Ty>>>(_Thrd_t *,_Target &&)' being compiled
1>        with
1>        [
1>            _Ty=std::tuple<void (__cdecl World::* )(void)>,
1>            _Target=std::unique_ptr<std::tuple<void (__cdecl World::* )(void)>,std::default_delete<std::tuple<void (__cdecl World::* )(void)>>>
1>        ]
1>d:\projects\blocky - opengl\src\chunk.cpp(339): note: see reference to function template instantiation 'std::thread::thread<void(__cdecl World::* )(void),,void>(_Fn &&)' being compiled
1>        with
1>        [
1>            _Fn=void (__cdecl World::* )(void)
1>        ]
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(240): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(240): note: With the following template arguments:
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(240): note: '_Callable=void (__cdecl World::* )(void)'
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\thr\xthread(240): note: '_Types={}'
**/

另外,我试图将所有成员放在public:范围内。它没有帮助。

1 个答案:

答案 0 :(得分:1)

您有两个问题:

  1. 编译器甚至会告诉您如何解决:您需要使用address-of运算符&来获取指向成员函数的指针。

  2. 第二个问题是非静态成员函数需要调用一个对象,它成为函数中的this指针。在创建线程时,它作为第一个参数传递(虽然它实际上没有传递给函数)。

  3. 因此,为了解决您的问题,您的初始化程序需要看起来像

    updateThread(&updateWorldLoop, this)