January 15, 2007 Typedef of class doesn't work? | ||||
---|---|---|---|---|
| ||||
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 Re: Typedef of class doesn't work? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bradley Smith | 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! |
Copyright © 1999-2021 by the D Language Foundation