在 gtkmm 应用程序中创建超时方法会导致 "void value not ignored as it ought to be" 错误

Creating a timeout method in a gtkmm app causes "void value not ignored as it ought to be" error

我刚刚开始使用 gtkmm,我正在尝试通过让超时方法调用我的 Update() 方法以预定义的时间间隔更新标签。但是,在我的 MainWindow class:

的构造函数中编写以下行时
Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::Update), 1000);

我收到以下错误:

/usr/include/sigc++-2.0/sigc++/functors/slot.h:136:36: error: void value not ignored as it ought to be return (typed_rep->functor_)();

有人知道如何解决这个问题或原因是什么吗?

编辑: 这是一个最小且可重现的示例:

main.ccp

#include <gtkmm.h>
#include "MainWindow.h"

int main(int argc, char* argv[])
{
    auto app = Gtk::Application::create(argc, argv, "com.companyname.test");

    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("prototype.glade");

    MainWindow* mainWindow = 0;
    builder->get_widget_derived("mainWindow", mainWindow);

    return app->run(*mainWindow);
}

MainWindow.h

#pragma once
#include <gtkmm.h>

class MainWindow : public Gtk::Window
{
public:
    MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
    virtual ~MainWindow();

protected:
    //Signal handlers:
    void Update();
};

MainWindow.cpp

#include "MainWindow.h"
#include <iostream>

MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade)
{
    // The following line creates "void value not ignored as it ought to be (...)" error
    Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::Update), 1000);
}

MainWindow::~MainWindow()
{

}

void MainWindow::Update()
{
    
    std::cout << "Update" << std::endl;
}

正如 Scheff 在评论中提到的,我忘记了 MainWindow::Update 需要 return 类型 bool 的值,正如 signal_timeout 所期望的那样。将更新方法更改为以下内容,解决了问题:

bool MainWindow::Update()
{
    
    std::cout << "Update" << std::endl;
    
    return true;
}