C++ 为什么可以';在Gtk::EventBox上调用remove()吗?

C++ 为什么可以';在Gtk::EventBox上调用remove()吗?,c++,gtkmm,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&

出于我无法理解的原因,这不起作用:

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的一个子类,它不是一个虚拟函数,也不会在任何地方被覆盖。那么这种行为的原因是什么呢?

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

容器.h

virtual void on_remove(Widget* widget);
void remove();
bin.h

virtual void on_remove(Widget* widget);
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);
}
#包括
甲级
{
公众:

voidfoo(int){std::cout“这不起作用”是什么意思?@LogicStuff正确,我应该说得更清楚。编辑了问题并添加了错误消息。我不是GTK人员,但
GTK::EventBox
可能声明
remove
,但不会提供重载,使
GTK::Widget
。如果是这样,它在名称解析期间不会在基类中拾取声明(Google成员隐藏)并且您必须提供一个完全限定的名称,就像您找到的解决方案一样,或者更改lambda以
Gtk::Container
作为其参数。