On Fri, 10 Dec 2010 11:35:50 -0500, d coder <dlang.co...@gmail.com> wrote:

Greetings All

I am trying to compile the following D2 code. The code giving compilation
issues is the "this()" function of the class Foo. The constructor basically tries to initialize all the data members of the class, of type BaseClass and
of type BaseClass array.

I am using class property tupleof to iterate over members of the class. Then
I check the type of each member and if the member is a BaseClass array, I
new all the elements of the array. Otherwise if the member is of the type
BaseClass, I new it as it is.

The issue is that when I try to compile the program, I get the error
bug.d(10): Error: no property 'length' for type 'test.Bar'

I am explicitly checking the field type, and I am making sure that the field is an array type, before looking for its length. So I am not sure why this
error appears. Please guide me.

Regards
Cherry

import std.stdio;
class BaseClass { }

class Bar: BaseClass { }

class Foo: BaseClass {
  this() {
    foreach(i, f; this.tupleof) {
      if (is (typeof(f) : BaseClass[])) {
for (size_t j = 0; j < f.length; ++j) {
  f[j] = new typeof(f[j]) ();
}
      }
      if (is(typeof(f) : BaseClass)) {
f = new typeof(f) ();
      }
    }
  }
  Bar instance1;
  Bar instance2;
  Bar [10] instances;
}

unittest {
  Foo foo;
  foo = new Foo;
}

is(typeof(f) : BaseClass[]) is a compile-time construct, yet you are trying to use it at runtime.

I'm not even sure how this could compile. I imagine that you could use a recursive template to deal with the tuple, but I didn't think you could use a foreach loop.

Is there a reason you can't directly reference the members? After all, you are writing the class.

Another thing, is(T : U) simply means T is implicitly castable to U. Due to a compiler bug, Bar[] is implicitly castable to BaseClass[].

is(T == U) ensures that the type is exact.

-Steve

Reply via email to