0

Widget から派生した T を使用して、Glib::RefPtr を GtkWidget に変換するのに問題があります。

#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 Copyright (C) 2011 Free Software Foundation, Inc. これはフリー ソフトウェアです。条件のコピーについてはソースを参照してください。保証はありません。商品性や特定の目的への適合性のためでさえありません。

Glib::RefPtr はスマート ポインターであり、DrawingAreaは Widget から派生しているため、これは機能するはずです。

逆参照 ( などf.put(*rp_mp,...)) は意図的に機能していません。ドキュメントには次のように記載されています。

SmartPtrからWidget&を取得するにはどうすればよいですか?

4

1 に答える 1

1

ニーズに合わせて設計できると思いますが、たとえばGlib::RefPtr foo次のように逆参照できます。

some_method_needing_a_reference(*foo.operator->())
于 2012-09-28T03:58:46.863 に答える