Need help with adding an element to a TArray filled with pointers

First of all I have to say that I feel very embarassed for having to post such a noobish question but I’ve been trying for the better part of the last 3 hours to no avail and my deadlines cannot wait.

I have the following code

UGoapAction* ac1 = NewObject<UGoapAction>(); ac1->Name = "A1";
UGoapAction* ac2 = NewObject<UGoapAction>(); ac2->Name = "A2";
UGoapAction* ac3 = NewObject<UGoapAction>(); ac3->Name = "A3";

UHumbleAStarNode* a1 = NewObject<UHumbleAStarNode>(); a1->Initialize(ac1); a1->HCost = 5;
UHumbleAStarNode* a2 = NewObject<UHumbleAStarNode>(); a2->Initialize(ac2); a2->HCost = 1;
UHumbleAStarNode* a3 = NewObject<UHumbleAStarNode>(); a3->Initialize(ac3); a3->HCost = 3;

UHumbleAStarNode const* ca1 = a1;
UHumbleAStarNode const* ca2 = a2;
UHumbleAStarNode const* ca3 = a3;

TArray<UHumbleAStarNode const *> t;
t.Add(ca1); //I've tried with a1 here as well - same error message

As you can see I have a TArray which hold elements of type

UHumbleAStarNode const *

so pointers to constant objects.

I’ve defined a “<” operator for this class so the Heapify methods of the TArray can use it.
It’s defined as

bool operator < (UHumbleAStarNode const & rhs) const;

And when I try to Add ca1, ca2, ca3(or a1, a2, a3) to the array I get this error compilation message:

2>D:\Epic Games\UE_4.23\Engine\Source\Runtime\Core\Public\Templates/Sorting.h(38): error C2664: 'bool TLess<UHumbleAStarNode *>::operator ()(const T &,const T &) const': cannot convert argument 1 from 'T' to 'const T &'
2>          with
2>              T=UHumbleAStarNode *
2>          ]
2>          and
2>              T=UHumbleAStarNode
2>          ]
2>          and
2>              T=UHumbleAStarNode *
2>          ]

I’ve tried all variations of pointers and references and constants and I can’t get it to work.…-exposed-to-bp

This thread mentions that this could happen if I were calling the Add function in a const function, which is not the case.

Any help would be greatly appreciated!

Edit: Okay I wen away for a couple of hours and when I came back and tried recompiling it finally compiled lol. However, I need to use the TArray<UHumbleAStarNode const *> as a priority queue so I tried calling


on it and unfortunately I’m getting the exact same error.

Okay, so I managed to make to compile the project Heapify() work. I removed the “<” operator from my UHumbleAStarNode class and started using the Heap overload methods which accept predicate as parameter.

Now my code looks like this

    TArray<UHumbleAStarNode const *> t;

    auto pred = ](UHumbleAStarNode const& lhs, UHumbleAStarNode const& rhs)
        return lhs.GetFValue() < rhs.GetFValue();


and it works a-ok. However I am still very interested in why I couldn’t compile with the “<” operator defined in my class.

You need to define operator as a free(often friend) function with two-arguments (exactly what you do in predicate-version)

class foo
  int value;
  friend operator<(foo const& lhs, foo const& rhs) { return lhs.value < rhs.value; }

Okay I added this function to the UHumbleAStarNode class

    friend bool operator < (UHumbleAStarNode const& lhs, UHumbleAStarNode const& rhs)
        return lhs.GetFValue() < lhs.GetFValue();

and it’s still giving me the same error