Thread overview | |||||
---|---|---|---|---|---|
|
April 05, 2012 Binary Heap Errors Class level vs function level | ||||
---|---|---|---|---|
| ||||
I'm still messing around with binary heaps. I've successfully created and used it on the function level but for some reason when I move it to the class level I get an error. Furthermore, i'm not entirely sure how to use a binary heap without auto as the type. class AStar { ReferenceNode[] openListContainer; auto openList = BinaryHeap!(ReferenceNode[], "a.fScore > b.fScore")(openListContainer, 0 ); // Error } Error 1 Error: template instance BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") does not match template declaration BinaryHeap(Store,alias less = "a < b") if (isRandomAccessRange!(Store) || isRandomAccessRange!(typeof(Store.init[]))) C:\Users\CP\Documents\Visual Studio 2010\Projects\D\STDS\NPC.d 101 However this is ok: class AStar { void RandomFunction() { ReferenceNode[] openListContainer; openListContainer.length = 500; auto openList = BinaryHeap!(ReferenceNode[], "a.fScore > b.fScore")(openListContainer, 0 ); //This is ok } } I'd also like to try this, but can't seem to figure it out: class AStar { ReferenceNode[] openListContainer; auto openList; //no identifier for declarator openlist this() { openListContainer.length = 500; openList = = BinaryHeap!(ReferenceNode[], "a.fScore > b.fScore")(openListContainer, 0 ); } } If I know what type openList was, after creating the heap, I could simply use that. I tried using typeid( openList ) to find out. I got the type being something like: BinaryHeap!(Referencenode[], "a.fScore > b.fScore") openList; However trying to use this as the type gives me this error: Error 1 Error: template instance BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") does not match template declaration BinaryHeap(Store,alias less = "a < b") if (isRandomAccessRange!(Store) || isRandomAccessRange!(typeof(Store.init[]))) C:\Users\CP\Documents\Visual Studio 2010\Projects\D\STDS\NPC.d 101 Error 2 Error: BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") is used as a type C:\Users\CP\Documents\Visual Studio 2010\Projects\D\STDS\NPC.d 101 I'm just trying to get a variable called openList to the class level so it doesn't keep getting initialized everytime the function is called. Any ideas on how to work this out? |
April 05, 2012 Re: Binary Heap Errors Class level vs function level | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Pons | On 04/04/2012 05:24 PM, Chris Pons wrote: > I'm still messing around with binary heaps. I've successfully created > and used it on the function level but for some reason when I move it to > the class level I get an error. Furthermore, i'm not entirely sure how > to use a binary heap without auto as the type. > > class AStar > { > ReferenceNode[] openListContainer; > auto openList = BinaryHeap!(ReferenceNode[], "a.fScore > > b.fScore")(openListContainer, 0 ); // Error > } To get the type, use an alias. Also, only compile-time expressions can be used to initialize members with in-class initializers. So you must initialize openListContainer in a constructor: import std.container; struct ReferenceNode { int fScore() @property { return 0; } } class AStar { ReferenceNode[] openListContainer; alias BinaryHeap!(ReferenceNode[], "a.fScore > b.fScore") MyBinaryHeap; MyBinaryHeap openList; this() { openList = MyBinaryHeap(openListContainer, 0 ); } } void main() { auto as = new AStar(); } > Error 1 Error: template instance BinaryHeap!(ReferenceNode[],"a.fScore > > b.fScore") BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") does not > match template declaration BinaryHeap(Store,alias less = "a < b") if > (isRandomAccessRange!(Store) || > isRandomAccessRange!(typeof(Store.init[]))) C:\Users\CP\Documents\Visual > Studio 2010\Projects\D\STDS\NPC.d 101 > > > However this is ok: > > class AStar > { > void RandomFunction() > { > ReferenceNode[] openListContainer; > openListContainer.length = 500; > auto openList = BinaryHeap!(ReferenceNode[], "a.fScore > > b.fScore")(openListContainer, 0 ); //This is ok > } > } That is ok, because now the initial value need not be a compile-time expression. RandomFunction() gets executed and the right-hand side is evaluatod. Fine. > > I'd also like to try this, but can't seem to figure it out: > > class AStar > { > ReferenceNode[] openListContainer; > auto openList; //no identifier for declarator openlist That cannot work. Being a statically-typed language, D must know the exact type of the variables at definition time. > this() > { > openListContainer.length = 500; > openList = = BinaryHeap!(ReferenceNode[], "a.fScore > > b.fScore")(openListContainer, 0 ); > } > } > > If I know what type openList was, after creating the heap, I could > simply use that. I tried using typeid( openList ) to find out. I got the > type being something like: > > BinaryHeap!(Referencenode[], "a.fScore > b.fScore") openList; > > However trying to use this as the type gives me this error: > > > Error 1 Error: template instance BinaryHeap!(ReferenceNode[],"a.fScore > > b.fScore") BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") does not > match template declaration BinaryHeap(Store,alias less = "a < b") if > (isRandomAccessRange!(Store) || > isRandomAccessRange!(typeof(Store.init[]))) C:\Users\CP\Documents\Visual > Studio 2010\Projects\D\STDS\NPC.d 101 > > > Error 2 Error: BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore") is > used as a type C:\Users\CP\Documents\Visual Studio > 2010\Projects\D\STDS\NPC.d 101 > > I'm just trying to get a variable called openList to the class level so > it doesn't keep getting initialized everytime the function is called. > > Any ideas on how to work this out? I hope the program above is clear. :) Ali |
April 05, 2012 Re: Binary Heap Errors Class level vs function level | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Thank you! That helps out quite a bit.
On Thursday, 5 April 2012 at 01:28:12 UTC, Ali Çehreli wrote:
>
> On 04/04/2012 05:24 PM, Chris Pons wrote:
> > I'm still messing around with binary heaps. I've successfully
> created
> > and used it on the function level but for some reason when I
> move it to
> > the class level I get an error. Furthermore, i'm not entirely
> sure how
> > to use a binary heap without auto as the type.
> >
> > class AStar
> > {
> > ReferenceNode[] openListContainer;
> > auto openList = BinaryHeap!(ReferenceNode[], "a.fScore >
> > b.fScore")(openListContainer, 0 ); // Error
> > }
>
> To get the type, use an alias. Also, only compile-time expressions can be used to initialize members with in-class initializers. So you must initialize openListContainer in a constructor:
>
> import std.container;
>
> struct ReferenceNode
> {
> int fScore() @property
> {
> return 0;
> }
> }
>
> class AStar
> {
> ReferenceNode[] openListContainer;
>
> alias BinaryHeap!(ReferenceNode[], "a.fScore > b.fScore") MyBinaryHeap;
>
> MyBinaryHeap openList;
>
> this()
> {
> openList = MyBinaryHeap(openListContainer, 0 );
> }
> }
>
> void main()
> {
> auto as = new AStar();
> }
>
> > Error 1 Error: template instance
> BinaryHeap!(ReferenceNode[],"a.fScore >
> > b.fScore") BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore")
> does not
> > match template declaration BinaryHeap(Store,alias less = "a <
> b") if
> > (isRandomAccessRange!(Store) ||
> > isRandomAccessRange!(typeof(Store.init[])))
> C:\Users\CP\Documents\Visual
> > Studio 2010\Projects\D\STDS\NPC.d 101
> >
> >
> > However this is ok:
> >
> > class AStar
> > {
> > void RandomFunction()
> > {
> > ReferenceNode[] openListContainer;
> > openListContainer.length = 500;
> > auto openList = BinaryHeap!(ReferenceNode[], "a.fScore >
> > b.fScore")(openListContainer, 0 ); //This is ok
> > }
> > }
>
> That is ok, because now the initial value need not be a compile-time expression. RandomFunction() gets executed and the right-hand side is evaluatod. Fine.
>
> >
> > I'd also like to try this, but can't seem to figure it out:
> >
> > class AStar
> > {
> > ReferenceNode[] openListContainer;
> > auto openList; //no identifier for declarator openlist
>
> That cannot work. Being a statically-typed language, D must know the exact type of the variables at definition time.
>
> > this()
> > {
> > openListContainer.length = 500;
> > openList = = BinaryHeap!(ReferenceNode[], "a.fScore >
> > b.fScore")(openListContainer, 0 );
> > }
> > }
> >
> > If I know what type openList was, after creating the heap, I
> could
> > simply use that. I tried using typeid( openList ) to find
> out. I got the
> > type being something like:
> >
> > BinaryHeap!(Referencenode[], "a.fScore > b.fScore") openList;
> >
> > However trying to use this as the type gives me this error:
> >
> >
> > Error 1 Error: template instance
> BinaryHeap!(ReferenceNode[],"a.fScore >
> > b.fScore") BinaryHeap!(ReferenceNode[],"a.fScore > b.fScore")
> does not
> > match template declaration BinaryHeap(Store,alias less = "a <
> b") if
> > (isRandomAccessRange!(Store) ||
> > isRandomAccessRange!(typeof(Store.init[])))
> C:\Users\CP\Documents\Visual
> > Studio 2010\Projects\D\STDS\NPC.d 101
> >
> >
> > Error 2 Error: BinaryHeap!(ReferenceNode[],"a.fScore >
> b.fScore") is
> > used as a type C:\Users\CP\Documents\Visual Studio
> > 2010\Projects\D\STDS\NPC.d 101
> >
> > I'm just trying to get a variable called openList to the
> class level so
> > it doesn't keep getting initialized everytime the function is
> called.
> >
> > Any ideas on how to work this out?
>
> I hope the program above is clear. :)
>
> Ali
|
Copyright © 1999-2021 by the D Language Foundation