Ok, I fixed it. I just need to put (K) type parameter to the other opIndexAssign
D not allow overload operators/methods with different type parameters. They must share same type parameters : void opIndexAssign(K)(K c, size_t row, size_t cl) {... } void opIndexAssign(K) (K v, size_t j) { ... } On Fri, 01 Jul 2011 21:46:56 +0000, Zardoz wrote: > Finally I try this small test code : > > struct A(T, int U) { > T x; > static enum foo = U; > > Tout opCast( Tout ) () > if (isA!Tout) { > Tout nt; > nt.x = x; > return nt; > } > > string toString() { > return to!string(x); > } > } > > struct B(T, int I) { > enum foo2 = I; > > alias A!(T, foo2) Internal; > > Internal[foo2 * 2] y; > > void opIndexAssign(K) (K v, size_t j) if (isA!(K) && K.foo == > Internal.foo && is(typeof(K.x) == typeof(y[0].x)) ) { > y[j] = v; > } > > void opIndexAssign(K) (K v, size_t j) if (isA!(K) && (K.foo != > Internal.foo || !is(typeof(K.x) == typeof(y[0].x))) ) { > y[j] = Internal(v.x); > } > > } > > template isA(T) { > immutable bool isA = __traits(compiles, > (){ > T t; > auto x = t.x; > auto u = t.foo; > } > ); > } > > > auto bla = A!(int, 2) (10); > auto bla2 =A!(int, 5) (5) > > B!(int, 3) bleh; > > bleh[1] = bla; > bleh[3] = bla2; > > writeln(bleh.y); > > And write : [0, 10, 0, 5, 0, 0] > > So this works. Only I need to discover why when I try it over Vector and > Matrix class, I get errors... > > Finally, I upload to github : git://github.com/Zardoz89/zmath.git I hope > that I not write some barbaric thing in my code.... I do all > self-learning D > > On Fri, 01 Jul 2011 17:19:36 +0200, Simen Kjaeraas wrote: > >> On Fri, 01 Jul 2011 08:58:32 +0200, Zardoz <luis.panad...@gmail.com> >> wrote: >> >>> Well, the problem is that I must do the cast always, see : >>> >>> // alias Matrix!(real,4) Mat4r; >>> // alias Vector!(float, 3) Vec3f; >>> // alias Vector!(real, 4) Vec4r; >>> // In Mat4r, VCol it's aliased to Vector!(real, 4) >>> >>> auto tcol = Mat4r.IDENTITY; >>> >>> auto v = cast(tcol.VCol) Vec3f(1, 2 ,3 ); auto v2 = Vec4r(-1, -2 ,-3 >>> ,-4); >>> >>> tcol[1] = v2; // Do a compiler error >>> tcol[2] = v; >> >> So more likely, this is what you want: >> >> void opIndexAssign(U)(Vector!(U,dim) v, size_t j) { >> static if (is(U == T)) { >> col[j] = v; >> } else { >> col[j] = cast(VCol)v; >> } >> } -- Yep, I'm afraid that I have a blog : zardoz.es