2015-07-10 14 views
0

出於某種原因,我是無法理解這不起作用:爲什麼我不能在Gtk :: EventBox上調用remove()?

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的子類,它不是一個虛函數,也不會覆蓋任何地方。那麼這種行爲的原因是什麼?

+0

你是什麼意思「這不行」? – LogicStuff

+0

@LogicStuff正確,我應該更清楚。編輯該問題並添加錯誤消息。 – v010dya

+0

我不是GTK的人,但'Gtk :: EventBox'可能聲明'remove',但不提供一個需要'Gtk :: Widget'的重載。如果是這樣,它不會在名稱解析(Google成員隱藏)期間提取基類中的聲明,您必須提供一個完全限定的名稱,例如您找到的解決方案或更改您的lambda以採用'Gtk :: Container作爲它的論據。 –

回答

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); 
} 

上面的代碼生成完全相同的錯誤。看起來這個名字會阻止任何進一步的查詢。我意識到倒下,但不知道這種情況發生在陰影功能實際上不適合世界上所有的thunk時。

相關問題