digitalmars.D - Template error messages
- bearophile (62/62) Jul 05 2009 If I compile the following D1 code:
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