Jane Li <[EMAIL PROTECTED]> writes: >Dear Ms./Sir, > >I am working on the problem of calling C++ functions from Perl. Your >clear tutorial style web page: Gluing C++ And Perl Together gave me >really great help. But what I am sticking now is that I have to embed a >C++ function which asks two input parameters of <string> class data type >like this: > >void func(string c1, string c2, classA* c3); > > >The typemap file are like this: > > >TYPEMAP >THES * O_OBJECT >string O_OBJECT
That is not appropriate typemap for std::string Now that STL is geting standard perhaps we should add something to the default map. Both perl strings and std::string can handle lengths so the converters are straight forward: TYPEMAP string T_STDSTRING INPUT T_STDSTRING (void) SvPV_nolen($arg); $var(SvPV_nolen($arg),SvCUR($arg)) OUTPUT T_STDSTRING sv_setpvn($arg, $var.c_str(), $var.length()); Above is un-tested. Another approach might be to define typeconverters between string/SV * and then just have XS code "use" an SV as a string TYPEMAP string T_SV And then have these at the top of your .xs file (after #including perl.h) inline operator SV *(const string &var) { // This creates a new SV every time - beware memory leaks return newSVpvn(var.c_str(), var.length()); } inline operator string &(SV *const &arg) { STRLEN len; const char *s = SvPV(arg,len); return string(s,len); } > > >However, when I use make test to run the program, it reports bunches of >lines like this: > >make test >g++ -c -fno-strict-aliasing -I/usr/local/include -O2 -march=i386 >-mcpu=i686 -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" -fPIC >-I/usr/lib/perl5/5.6.1/i386-linux/CORE thesaurusLib.c >thesaurusLib.c: In function `void XS_thesaurusLib_relatedness (CV *)': >thesaurusLib.c:80: no matching function for call to `basic_string<char, >string_char_traits<char>, __default_alloc_template<true, 0> >>::basic_string (IV)' >/usr/include/g++-3/std/bastring.h:176: candidates are: >basic_string<charT, traits, Allocator>::basic_string () [with charT = >char, traits = string_char_traits<char>, Allocator = >__default_alloc_template<true, 0>] >/usr/include/g++-3/std/bastring.h:177: >basic_string<charT, traits, Allocator>::basic_string (const >basic_string<charT, traits, Allocator> &) [with charT = char, traits = >string_char_traits<char>, Allocator = __default_alloc_template<true, >0>] >.... >make: *** [thesaurusLib.o] Error 1 > >at the top of .xs file I have already included the header file like this: > >#include "string" > >The other parts are made by following the steps in your webpage. > > >It seems that xsubpp cannot recognize the string class in C++, is it >right? Or are there any ideas about this? This problem has puzzled me for >days and I have to deal with it in order to continue my work. I really >need your help or any ideas. > >Thanks in advance. > >Regards, > >Jane.