【问题标题】:Making a thread inside a class give me error C2664在类中创建线程给我错误 C2664
【发布时间】:2016-10-24 10:59:26
【问题描述】:

让我把你放在上下文中。我正在使用 Qt Creator 制作一个聊天框。我对 C++ 很陌生,所以这是一个挑战。我想使用std::thread 创建一个线程。这是我写的代码:

window.h

class Window: public QWidget
{
Q_OBJECT

public:
Window();

public slots:
    void Config();

private:
    void ListenToClients(Server server);

    //member...
};

window.cpp

Window::Window(): QWidget()
{
    //not important code...    

    do
    {
        //nothing
    }while(config.getLaunch() == false);

    Server myServer(config.getPort(), config.getBroadcast());
    std::thread serverThread(&Window::ListenToClients, this, myServer);

}

void Window::Config()
{
    config.exec();
}

void Window::ListenToClients(Server server)
{
    for(int i = 0; i < 100; i++)
    {
        server.ListenNewConnections();
    }
}

所以我得到这个错误:erreur: C2664: 'std::tuple&lt;void (__cdecl Window::* )(Server),Window *,Server&gt;::tuple(std::tuple&lt;void (__cdecl Window::* )(Server),Window *,Server&gt; &amp;&amp;)'ÿ: imossible to convert argument 1 of 'void (__cdecl Window::* )(Server)' in 'std::allocator_arg_t'

我不知道为什么以及这意味着什么。我搜索了一下,但似乎没有人遇到过像这样的错误。所以,我指望你们了。

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案1】:

    “std::allocator_arg_t”听起来像是涉及到您的构造函数,因为它正在分配一些东西:

    Window::Window(): QWidget() 无效,您已经在类声明中从 QWidget 继承,所以 QWidget 的构造函数被隐式调用。 Window::Window() 就足够了。

    另外:我不知道public slots: 应该是什么意思。您可以完全省略它,因为您已经拥有上面的 public: 限定符。

    【讨论】:

    • public slots 是一个 Qt 扩展,如果他希望他的 Config() 函数成为一个插槽,则操作不能省略它。
    • Window::Window(): QWidget() 是有效的,但不带参数调用QWidget() 是不必要的(通常只有在将参数传递给QWidget 的构造函数时才会这样做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2013-09-09
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多