From: William S F. <ws...@fu...> - 2006-11-06 23:14:39
|
Steven N. Hirsch wrote: > On Sat, 4 Nov 2006, William S Fulton wrote: > >> There aren't many perl experts around on the list. Nevertheless, I don't >> see what the problem is. I tried this interface file: >> >> // File: example.i >> %module example >> >> %inline %{ >> #include <iostream> >> using namespace std; >> template <class T> >> class foo_base { >> public: // must be public >> void bar( T parm1 ) { >> cout << parm1 << endl; >> } >> }; >> %} >> %template(foo_char) foo_base<char *>; >> >> %inline %{ >> class foo_derived : public foo_base<char *> { >> // .... >> }; >> %} >> >> with this: >> >> # file: runme.pl >> use example; >> >> $fd = new example::foo_derived(); >> $fd->bar( "Hello, world" ); >> >> Run through swig-1.3.30rc1 and the output is: >> >> $ perl runme.pl >> Hello, world >> $ >> > > Yes, that exact syntax DOES work. However, you will see the problem if > you change the declaration of foo_base::bar to: > > void bar( const T & parm1 ); > > or > > void bar( T & parm1 ); > > > In either case, you will then have to explicitly define this in > class foo_derived: > > .... > > public: > int bar( char *arg1 ) { > return foo_base<char *>::bar( arg1 ); > } > > ..... > > in order to have Swig generate workable code. > Yes, this is a bug. Please put it in the bug tracker. > Also, I would have thought it possible to use the %extend pragma to define > the explicit overload, but it does not work. For example, instead of > placing the overloaded 'bar' method inside foo_derived (as above), I > tried: > > %extend foo_derived { > > int bar( char *arg1 ) { > return foo_base<char *>::bar( arg1 ); > } > > }; > > It fails at compile time with a complaint of > > ".. cannot call member function foo_base<T>::bar(const T&) without object" > > I've read and re-read the documentation for extend until my head hurt, and > it appears as if this should work. For whatever reason, Swig cannot > understand that I'm adding a class method. > Okay, so this isn't clearly documented and I'll fix that up, but you need: return self->foo_base<char *>::bar( arg1 ); instead of return foo_base<char *>::bar( arg1 ); self is equivalent to the 'this' pointer. You can't use 'this' as the %extend method is actually a global function, take a look at the generated code. William |