On 01/26/2011 07:29 PM, Jesse Phillips wrote:
spir Wrote:
Hello,
This fails:
class T0 {}
class T1 : T0 {}
class T2 : T0 {}
unittest {
auto t1 = new T1();
auto t2 = new T2();
T0[] ts = [t1, t2];
}
Error: cannot implicitly convert expression (t1) of type __trials__.T0 to
__trials__.T2
Error: cannot implicitly convert expression ([(__error),t2]) of type T2[] to
T0[]
D takes the type of the last element. I guess it has been decided to take the
common type but hasn't been implemented. Anyway your two reasonable options are:
auto ts = to!(T0[])([...]);
auto ts = [new T1(), to!(T0)(new T2())]
I recommend using std.conv.to instead of a cast because it is safer. Though
cast is a no-op and isn't any less safe in this case.
Right, casting a /single/ element works:
auto x = [cast(T0)(t1), t2];
auto y = [t1, cast(T0)(t2)];
But to! fails:
auto x = [to!(T0)(t1), t2];
auto y = [t1, to!(T0)(t2)];
/usr/include/d/dmd/phobos/std/conv.d(99): Error: template std.conv.toImpl(T,S)
if (!implicitlyConverts!(S,T) && isSomeString!(T) && isInputRange!(Unqual!(S))
&& isSomeChar!(ElementType!(S))) toImpl(T,S) if (!implicitlyConverts!(S,T) &&
isSomeString!(T) && isInputRange!(Unqual!(S)) && isSomeChar!(ElementType!(S)))
matches more than one template declaration,
/usr/include/d/dmd/phobos/std/conv.d(559):toImpl(Target,Source) if
(implicitlyConverts!(Source,Target)) and
/usr/include/d/dmd/phobos/std/conv.d(626):toImpl(T,S) if (is(S : Object) &&
is(T : Object))
Already had this endless error message once ;-)
Looks like another bug of non mutually exclusive template constraints?
Denis
--
_________________
vita es estrany
spir.wikidot.com