【发布时间】:2012-09-27 13:36:30
【问题描述】:
我无法将 Glib::RefPtr 转换为 GtkWidget,其中 T 派生自 Widget:
#include <gtkmm/drawingarea.h>
#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <gtkmm/fixed.h>
class MyPic : public Gtk::DrawingArea {
public:
};
int main(int argc, char* argv[]) {
Gtk::Fixed f;
Gtk::DrawingArea da; // this works.
Gtk::DrawingArea mp; // this works.
Glib::RefPtr<MyPic> rp_mp; // this not.
f.put(da, 10, 20);
f.put(mp, 10, 30);
f.put(rp_mp, 10, 40); // Line # 19
}
这不会编译:
joerg> g++ x.cpp `pkg-config --cflags --libs gtkmm-3.0`
x.cpp: In function ‘int main(int, char**)’:
x.cpp:19:24: error: no matching function for call to ‘Gtk::Fixed::put(Glib::RefPtr<MyPic>&, int, int)’
x.cpp:19:24: note: candidate is:
/usr/include/gtkmm-3.0/gtkmm/fixed.h:123:8: note: void Gtk::Fixed::put(Gtk::Widget&, int, int)
/usr/include/gtkmm-3.0/gtkmm/fixed.h:123:8: note: no known conversion for argument 1 from ‘Glib::RefPtr<MyPic>’ to ‘Gtk::Widget&’
joerg> g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 版权所有 (C) 2011 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不考虑适销性或特定用途的适用性。
Glib::RefPtr 是一个智能指针,DrawingArea 是从 Widget 派生的,所以这应该可以工作。
取消引用(如 f.put(*rp_mp,...) )故意不起作用。文档说明:"*Unlike most other smart pointers, RefPtr doesn't support dereferencing through * object_ptr.*"
如何从 SmartPtr 获取 Widget&?
【问题讨论】:
-
取消引用它怎么样??
-
解除引用(如 f.put(*rp_mp,10,40) )将不起作用,并且被记录为不起作用“与大多数其他智能指针不同,RefPtr 不支持通过 * object_ptr 进行解除引用。” ,来自developer.gnome.org/glibmm/unstable/classGlib_1_1RefPtr.html。我将其添加到问题中。
-
这对 s.th 来说是一个非常奇怪的行为。称为“智能指针”,但如果是这样的话,就是这样。
-
问题是为什么你首先有一个小部件的
RefPtr。RefPtr是为资源池设计的,而不是小部件。 -
这是一个精简的例子,真正的代码更长。我使用了这个 RefPtr,因为我在
std::vector中收集了小部件。这是一个 Gtk::Fixed 与灵活数量的缩略图,实现为派生小部件(来自 DrawingArea)。因此,如果您能提出一种更好的方法将我的不同数量的小部件放入容器中,那也会有所帮助。