Binary Heap Errors Class level vs function level

Ali Çehreli acehreli at yahoo.com
Wed Apr 4 18:28:11 PDT 2012


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



More information about the Digitalmars-d-learn mailing list