Thanks. I imagined something similar, that "Vector" alone not is type. How I can templatize opIndexAssign function ? I tried this :
void opIndexAssign(U)(U v, size_t j) { col[j] = v; } And I get a error : Error: template zmath.matrix.Matrix!(float,2).Matrix.opIndexAssign(U) conflicts with function zmath.matrix.Matrix!(float,2).Matrix.opIndexAssign at src/matrix.d(261) That I interpret that this opIndexAssign clash with other opIndexAssign that I have to direct access to matrix cells void opIndexAssign(T c, size_t row, size_t cl) { col[cl][row] = c; } I said before that I made a opCast for Vector ? On Fri, 01 Jul 2011 00:12:43 +0000, Jonathan M Davis wrote: > On 2011-06-30 16:39, Zardoz wrote: >> I have a parametrized struct (Vector!(T, dim)) that takes two >> parameters (Type and a number). And made some Alias with defaults >> parameters. >> >> In other struct (Matrix!(T, dim)), that uses these struct to represent >> a matrix in column-major order. I have a internall alias for Vector >> using internally (alias Vector!(T,dim_) VCol;) . The problem that I >> have it's when I try to use opIndexAssign to assign to a column a >> Vector. I try this : >> >> void opIndexAssign(Vector v, size_t j) { if ( code that see if VCol if >> same type that v ) { col[j] = v; >> } else { >> col[j] = cast (VCol) v; >> } >> } >> >> But not compile... I get this error : Error: struct >> zmath.vector.Vector(T,ulong dim_) if (__traits (isFloating,T)) is used >> as a type >> Error: template instance zmath.matrix.Matrix!(float,2) error >> instantiating >> >> So finally I try this : >> /** >> * Assigns a new column vector >> */ >> void opIndexAssign(VCol v, size_t j) { col[j] = v; >> } >> >> But now I must do cast outside, even knowing that are same type. Plus >> now I must keep VCol alias public. >> >> How should fix this, or What is the correct way of doing this ? >> >> >> Note : I have a opCast for Vector that cast between Vectors with >> different parameters and it's checked that works. >> >> Second Question : I'm thinking publish this small Vector/Quaternion/ >> Matrix lib that I made learning D2.. where I should put and how ? (and >> I use Git) > > The first thing that you need to understand is that Vector is not a > type. It does not exist. Vector!(int, 4) is a type. Vector!(float, 3) is > a type. Vector is not. Vector is a template for a type. When you use a > template, you instantiate it for a particular set of arguments, and that > creates a new type. An instantiation of a templated type such as Vector > is a type, and every instantiation is its own, separate type which has > no connection with any other instantion of that template. So, it makes > no sense for a function to take a Vector (though within the Vector > template that works, because Vector stands for that particular > instantiation inside of the Vector template). If you want a function to > take multiple instantiations of a template, then you need to templatize > the function. If you want it to take a particular instantiation of a > template, then you give its parameter that exact template instantiation. > > Now, if you want two separate instantions (such as Vector!(int, 3) and > Vector! (float, 3)) to interact, you're going to need to either write > opCasts to cast between them or have templated functions which are > templated on both of their types (e.g. func(V1, V2)(V1 vector1, V2 > vector2) {...}). They are two completed different types, just like if > you created IntVector and FloatVector, so you have to write code which > allows them to interact. They aren't going to just work together because > they came from the same template. > > - Jonathan M Davis -- Yep, I'm afraid that I have a blog : zardoz.es