Ok. No surprise. Turns out it was loser error. But PLEASE, will someone
explain to me why this works:
class ToolbarMenuElem : public
Gtk::Toolbar_Helpers::ToggleElem, public SigC::Object {
public:
ToolbarMenuElem(
Gtk::Menu * menu_, const Glib::ustring & text, Gtk::Widget
& content,
const Glib::ustring & tooltip_text=Glib::ustring(),
const Glib::ustring & tooltip_private_text=Glib::ustring());
}
I took the time to actually attempt to figure out the error msg I
posted previously and something clued me in to adding the public
derivation of SigC::Object to the ToolbarMenuElem class. Problem is, I
have no clue why this worked. And how have I been writing Gtkmm
(sporadically) for a couple of years now and never had to do that
before? Yeesh this C++ GUI stuff is confusing. I'm such a Noob.
Myles
S. Myles Prather wrote:
I didn't think this would work when I typed it in, and sure nuf, it
don't. I'm trying to pass arguments to the constructor of my base
class (a ToggleElem), but I can't figure out how to pass in the slot
(Callback0). 15 lines of code is worth a million words:
class ToolbarMenuElem : public
Gtk::Toolbar_Helpers::ToggleElem {
public:
ToolbarMenuElem(
Gtk::Menu * menu_, const Glib::ustring & text, Gtk::Widget
& content,
const Glib::ustring & tooltip_text=Glib::ustring(),
const Glib::ustring & tooltip_private_text=Glib::ustring());
}
ToolbarMenuElem::ToolbarMenuElem(
Gtk::Menu * menu_, const Glib::ustring & text, Gtk::Widget &
content,
const Glib::ustring & tooltip_text,
const Glib::ustring & tooltip_private_text)
:
Gtk::Toolbar_Helpers::ToggleElem(text, content, SigC::slot(*this,
&ToolbarMenuElem::on_toggled),
tooltip_text, tooltip_private_text) {
...
}
I'm getting a very odd compiler error that points to header files in
SigC++, but I'm pretty sure it comes back to me trying to use *this in the argument list for the
base class constructor call.
Questions:
1) Is there any way to accomplish what I'm trying to do?
2) If not, how do I generate a NULL slot to appease compilation? I
think I can hook up the the toggled signal after I'm off and running. I
tried like hell, but couldn't come up with the magic string of greek
C++ to make the compiler happy.
3) When does 'this' come into
existence? Shouldn't it be the first argument in the call to
ToolbarMenuElem::ToolbarMenuElem(...), and therefore, available for use
in the base class constructor call? i.e., at the time of the call to
the ToolbarMenuElem constructor, the memory has been allocated and a
pointer to it should exist, right?
4) Is this a bug/feature-request for gtk/gtkmm? Am I doing something I
shouldn't be trying to do? Gtkmm brags about the ability to derive from
Gtk objects. What gives? Maybe we just need a constructor that doesn't
require a Callback0. Trust me, I'll hook one up later (if I feel the
need)!
5) Why can't anything ever go smoothly :( ?
Much appreciation in advance! I'm at a brick wall here. Work-arounds in
my head right now totally defeat the purpose of C++.
Here's the (un-intelligible?) compiler error message:
|| In file included from
/usr/include/sigc++-1.2/sigc++/object_slot.h:73:
|| /usr/include/sigc++-1.2/sigc++/object_slot.h: In constructor
|| `SigC::ObjectSlotNode::ObjectSlotNode(void (*)(void*), T*, void*,
T2) [with
|| T = ToolbarMenuElem, T2 = void (ToolbarMenuElem::*)()]':
/usr/include/sigc++-1.2/sigc++/slot.h|211| instantiated from
`SigC::Slot0<R>::Slot0(SigC::SlotNode*) [with R = void]'
/usr/include/sigc++-1.2/sigc++/object_slot.h|73| instantiated from
`SigC::Slot0<R> SigC::slot(O1&, R (O2::*)()) [with R = void,
O1 = ToolbarMenuElem, O2 = ToolbarMenuElem]'
ToolbarMenuElem.cc|14| instantiated from here
/usr/include/sigc++-1.2/sigc++/object_slot.h|45| no matching function
for call
|| to `SigC::ObjectSlotNode::init(ToolbarMenuElem*&, void*&,
void
|| (SigC::Object::*&)())'
/usr/include/sigc++-1.2/sigc++/object_slot.h|46| candidates are: void
|| SigC::ObjectSlotNode::init(SigC::Object*, void*, void
(SigC::Object::*)())
|| In file included from
/usr/include/sigc++-1.2/sigc++/object_slot.h:187:
|| /usr/include/sigc++-1.2/sigc++/object_slot.h: In constructor
|| `SigC::ObjectSlotNode::ObjectSlotNode(void (*)(void*), T*, void*,
T2) [with
|| T = ToolbarMenuElem, T2 = void (ToolbarMenuElem::*)(int&,
int&, bool&)]':
/usr/include/sigc++-1.2/sigc++/slot.h|343| instantiated from
`SigC::Slot3<R, P1, P2, P3>::Slot3(SigC::SlotNode*) [with R =
void, P1 = int&, P2 = int&, P3 = bool&]'
/usr/include/sigc++-1.2/sigc++/object_slot.h|187| instantiated from
`SigC::Slot3<R, P1, P2, P3> SigC::slot(O1&, R (O2::*)(P1, P2,
P3)) [with R = void, P1 = int&, P2 = int&, P3 = bool&, O1 =
ToolbarMenuElem, O2 = ToolbarMenuElem]'
ToolbarMenuElem.cc|28| instantiated from here
/usr/include/sigc++-1.2/sigc++/object_slot.h|45| no matching function
for call
|| to `SigC::ObjectSlotNode::init(ToolbarMenuElem*&, void*&,
void
|| (SigC::Object::*&)())'
/usr/include/sigc++-1.2/sigc++/object_slot.h|46| candidates are: void
|| SigC::ObjectSlotNode::init(SigC::Object*, void*, void
(SigC::Object::*)())
|| make: *** [ToolbarMenuElem.o] Error 1
|