Anybody?

On 11/13/06, Jeffrey Ratcliffe <[EMAIL PROTECTED]> wrote:
On 11/13/06, Nicholas Clark <[EMAIL PROTECTED]> wrote:
> On Mon, Nov 13, 2006 at 08:56:14AM +0100, Jeffrey Ratcliffe wrote:
>
> > There are three forms of the C++ new() function, depending on whether
> > you are providing a numerator and denominator as initialisation,
> > another fraction, or nothing. Can I wrap all three with one function,
> > or do I have to create three Perl functions?
>
> Yes, but you'll have to put in explicit logic to decide which C++ new to use
> inside your XS code. I'm unaware of any way to automatically wrap overloaded
> functions.

OK. I've tried to do this and have got two problems. The first is
casting, I'm getting with the XS fragment listed below:

Fract.xs:45: error: no matching function for call to `fract::fract(fract*&)'
fract.h:17: note: candidates are: fract::fract(long int, long int)
fract.h:16: note:                 fract::fract(const fract&)
fract.h:15: note:                 fract::fract()

I've obviously got something not quite right with the

arg = (fract *)SvIV((SV*)SvRV( arg1 ));

line. Any idea what it is?

Secondly, I can't seem to make the arguments optional. Despite the

PROTOTYPE: ;$$

line, the c code produces still starts:

    if (items != 3)
        Perl_croak(aTHX_ "Usage: Fract::new(CLASS, arg1, arg2)");
    {

I'd be grateful for any ideas.

Thanks

Jeff

XS fragment:

fract *
fract::new(arg1, arg2)
        SV * arg1
        SV * arg2
    PROTOTYPE: ;$$
    CODE:
        if (items == 3) {
         RETVAL = new fract(SvIV(arg1), SvIV(arg2));
        }
        else if (items == 2) {
         fract * arg;
         arg = (fract *)SvIV((SV*)SvRV( arg1 ));
         RETVAL = new fract(arg);
        }
        else if (items == 1) {
         RETVAL = new fract;
        }
    OUTPUT:
        RETVAL

Reply via email to