January 15, 2007
import std.stdio;

class A {
  this(float v) { value = v; }
  float getValue() { return value; }
	
private:
  float value;
}

typedef A B;

void main() {
  B b = new B(1);
  writefln(b.value);
}

The above code produces the following errors:
>dmd testTypedef.d
testTypedef.d(14): Error: cannot implicitly convert expression (new B(1F)) of type testTypedef.A to B
testTypedef.d(15): Error: this for value needs to be type A not type B

Aliasing works for classes, but not typedef. Why not?

Thanks,
  Bradley
February 04, 2007
Bradley Smith wrote:
> 
> import std.stdio;
> 
> class A {
>   this(float v) { value = v; }
>   float getValue() { return value; }
>     private:
>   float value;
> }
> 
> typedef A B;
> 
> void main() {
>   B b = new B(1);
>   writefln(b.value);
> }
> 
> The above code produces the following errors:
>  >dmd testTypedef.d
> testTypedef.d(14): Error: cannot implicitly convert expression (new B(1F)) of type testTypedef.A to B
> testTypedef.d(15): Error: this for value needs to be type A not type B
> 
> Aliasing works for classes, but not typedef. Why not?
> 
> Thanks,
>   Bradley
typedef seems broken in a much more general way than that. (Seems, not is.)  I don't have a small example but I defined
typedef	uint	NodeNbr;
typedef	NodeNbr	ObjAddr;

and then got:
charles@mandala1:~/projects/D/Parody$ dmd -c db.d
db.d(37): constructor node.Node.this (NodeFile,NodeNbr) does not match parameter types (NodeFile,uint)
db.d(37): Error: cannot implicitly convert expression (n) of type uint to NodeNbr
charles@mandala1:~/projects/D/Parody$ dmd -c db.d
db.d(37): constructor node.Node.this (NodeFile,NodeNbr) does not match parameter types (NodeFile,NodeNbr)
db.d(37): Error: cannot implicitly convert expression (n) of type NodeNbr to NodeNbr
charles@mandala1:~/projects/D/Parody$ dmd -c db.d
db.d(37): constructor node.Node.this (NodeFile,NodeNbr) does not match parameter types (NodeFile,NodeNbr)
db.d(37): Error: cannot implicitly convert expression (nd) of type NodeNbr to NodeNbr

(Each separate compilation represents a different way of arranging things.)

FWIW, they were calling a class defined in another file, and I got around this by using:
typedef	node.NodeNbr	ObjAddr;

This does make sense.  But the error message is so totally unhelpful that this almost doesn't seem worth the effort.

When I used alias instead of typedef it compiled without error.  That was the first step in figuring out what the problem was.  Better error messages are REALLY needed!