On 06/08/2010 21:08, Blonder wrote:
Hello, I am trying to understand how operator overloading works with D. I am a 
C++
programmer and I am reading the book of Andrei Alexandrescu and try to 
understand
D and it's language features.

My Group example don't compile, the error is:
Error: template instance opBinary!("+") matches more than one template
declaration, ...

I know that it matches more than one, that was my intention, because I want to 
be
able to write also

h = g+2 for example.

Is this possible in D?
Can you help me?
Thanks,
Andreas.


You need to add a second template parameter for the function arguments and add a template constrait like so:

struct Group {
    int i1;

    Group opBinary(string op, U) (U x)
                if(op == "+" && is(U: int))
        {
        // do somehting
        return this;
    }

        Group opBinary(string op, U) (U rhs)
                if(op == "+" && is(U: Group))
        {
        // do something
        return this;
    }
}


void main() {
        Group g, h;
        g.i1 = 1;

        h = g+g;
}

Personally, I'm with you and I would expect that the compiler should example the function parameters after the template string parameter but it doesn't.

It's important to note: you must use the template parameter U, you can not explitictly use the type (int/Group) like you can in C++.

ie you can't do:

struct Group {
    int i1;

    // DOES NOT WORK
    Group opBinary(string op, U) (int x)
                if(op == "+" && is(U: int))
        {
        // do somehting
        return this;
    }

    // DOES NOT WORK
    Group opBinary(string op, U) (Group rhs)
                if(op == "+" && is(U: Group))
        {
        // do something
        return this;
    }
}

--
My enormous talent is exceeded only by my outrageous laziness.
http://www.ssTk.co.uk

Reply via email to