为什么我不能在Gtk :: EventBox上调用remove()?

时间:2015-07-10 19:20:19

标签: c++ gtkmm

出于某些原因,超出我的原因,这不起作用:

Gtk::EventBox *eb;
// ...
eb->foreach([eb](Gtk::Widget& w){ eb->remove(w); });

我得到的错误是:

ImageClick.cpp: In lambda function:
ImageClick.cpp:20:50: error: no matching function for call to ‘Gtk::EventBox::remove(Gtk::Widget&)’
    eb->foreach([eb](Gtk::Widget& w){ eb->remove(w); });
                                                  ^
ImageClick.cpp:20:50: note: candidate is:
In file included from /usr/include/gtkmm-3.0/gtkmm/window.h:31:0,
                 from /usr/include/gtkmm-3.0/gtkmm/dialog.h:30,
                 from /usr/include/gtkmm-3.0/gtkmm/aboutdialog.h:33,
                 from /usr/include/gtkmm-3.0/gtkmm.h:99,
                 from ImageClick.cpp:1:
/usr/include/gtkmm-3.0/gtkmm/bin.h:141:8: note: void Gtk::Bin::remove()
   void remove();
        ^
/usr/include/gtkmm-3.0/gtkmm/bin.h:141:8: note:   candidate expects 0 arguments, 1 provided

但如果我将其更改为eb->Gtk::Container::remove(w);,它会按预期工作。文档显示Gtk :: EventBox是Gtk :: Container的子类,它不是虚函数,也不是任何地方都被覆盖。那么这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

看来这是C ++的正常操作

<强> container.h

virtual void on_remove(Widget* widget);

<强> bin.h

void remove();

eventbox.h 没有定义此功能。

尝试重新创建此方案:

#include <iostream>

class A
{
public:
    void foo(int) { std::cout << 'A' << std::endl; }
};

class B : public A
{
public:
    void foo() { std::cout << 'B' << std::endl; }
};

class C : public B
{
};

int main()
{
    C c;
    c.foo(5);
}

上面的代码生成完全相同的错误。看来该名称会停止任何进一步的查找。我知道shadowning,但是当影子函数实际上并不适合世界上所有的thunk时,我都不知道这已经发生了。