www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Template error messages

If I compile the following D1 code:

// D1 code
C pick(C)(ref C x, ref C y)
    // for D2:
    /* if (__traits(compiles, better(C.init, C.init))) */ {
        if (better(x, y))
            return x;
        else
            return y;
}

struct Apple {
    int rating;
}

struct Orange {
    int rating;
}

bool better(ref Apple a, ref Apple b) { return b.rating < a.rating; }

void main() {
    auto a1 = Apple(3), a2 = Apple(5);
    auto a3 = pick(a1, a2);

    auto o1 = Orange(3), o2 = Orange(5);
    auto o3 = pick(o1, o2);
}

The errors shown by LDC/DMD (the error on line 26 is the most important, but
it's buried under several other lines of error messages), are:

Line 5: function t.better (Apple ,Apple ) does not match parameter types
(Orange ,Orange )
Line 5: Error: cannot implicitly convert expression (x) of type Orange to Apple
Line 5: Error: cast(Apple )x is not an lvalue
Line 5: Error: cannot implicitly convert expression (y) of type Orange to Apple
Line 5: Error: cast(Apple )y is not an lvalue
Line 26: template instance t.pick!(Orange ) error instantiating


While the following equivalent C++ code:

template <class C> const C& pick(const C& x, const C& y) {
    if (better(x, y))
        return x;
    else
        return y;
}

struct Apple {
    Apple(int r) : rating(r) {}
    int rating;
};

struct Orange {
    Orange(int r) : rating(r) {}
    int rating;
};

bool better(const Apple& a, const Apple& b) { return b.rating < a.rating; }

int main() {
    Apple a1(3), a2(5);
    Apple a3 = pick(a1, a2);

    Orange o1(3), o2(5);
    Orange o3 = pick(o1, o2);
}


Compiled with G++ 4.3.3 gives the following error message, that shows the line
24 before the other ones:

apple_test_cpp.cpp: In function 'const Comparable& pick(const Comparable&,
const Comparable&) [with Comparable = Orange]
':
apple_test_cpp.cpp:24:   instantiated from here
apple_test_cpp.cpp:4: error: invalid initialization of reference of type 'const
Apple&' from expression of type 'const O
range'
apple_test_cpp.cpp:17: error: in passing argument 1 of 'bool better(const
Apple&, const Apple&)'

I'd like DMD to act as G++ and to show first of all the error relative to where
the template was (tried to be) instantiated.

Bye,
bearophile
Jul 05 2009