Hello. I usually use blueprints, and while solving one of the solution, I ran into blueprint loops is so slow and decided to rewrite some of the functions in C ++ so that the project would work well even without navitization. But I ran into a problem and that’s why I came here to ask for your help.
The essence of the problem.
I’m trying to find the a component I need in the array of my structure (FSplineMeshCollisions) in the form of the element index with the .Find (Element) command, but the search gives me the error C2678. I have been stuck on this issue for the 2nd day. Searching in Google by Eror C2678 did not help me much. I also tried to investigate my bpuprint function by creating a C ++ file from it, but it helped me to solve the problem. Help me please.
I created the Cpp function as a Cpp Function Library for next calling it into blueprint.
SplineMeshControl.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Components/SplineMeshComponent.h"
#include "Components/BoxComponent.h"
#include "UObject/WeakObjectPtrTemplates.h"
#include "UObject/UObjectBase.h"
#include "UObject/UObjectBaseUtility.h"
#include "UObject/Object.h"
#include "Components/PrimitiveComponent.h"
#include "Components/SceneComponent.h"
#include "Kismet/KismetSystemLibrary.h"
#include "Templates/Casts.h"
#include "Containers/ContainerAllocationPolicies.h"
#include "GeneratedCodeHelpers.h"
#include "Containers/Array.h"
#include "SplineMeshControl.generated.h"
USTRUCT(BlueprintType)
struct FSplineMeshCollisions
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
USplineMeshComponent* SplineOwner;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<UBoxComponent*> Collisions;
};
UCLASS()
class DIGGER_API USplineMeshControl : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, Category = "MySpline")
static TArray<USplineMeshComponent*> CheckSplineOverlaps_C(TArray<FSplineMeshCollisions> InputArray);
static TArray<UPrimitiveComponent*> RemoveSelfAndCombinedComponents_C(TArray<UPrimitiveComponent*> InputComponentToProcess,FSplineMeshCollisions CurrentSplineCollision,TArray<FSplineMeshCollisions> FullColliisionArray);
static TArray<USplineMeshComponent*> FindSplineMeshByOverlapedComponent_C(TArray<UPrimitiveComponent*> InputComponent, TArray<FSplineMeshCollisions> FullCollisionsArray);
};
SplineMeshControl.cpp
#include "SplineMeshControl.h"
TArray<UPrimitiveComponent*> USplineMeshControl::RemoveSelfAndCombinedComponents_C(TArray<UPrimitiveComponent*> InputComponentToProcess,FSplineMeshCollisions CurrentSplineCollision,TArray<FSplineMeshCollisions> FullColliisionArray)
{
int32 FindedIndex;
FindedIndex = FullColliisionArray.Find(CurrentSplineCollision);
TArray<UPrimitiveComponent*> OutArray();
TArray<UPrimitiveComponent*> ComponentToRemove{};
if (FindedIndex != -1) {
ComponentToRemove.Append(FullColliisionArray[FindedIndex - 1].Collisions);
ComponentToRemove.Append(FullColliisionArray[FindedIndex].Collisions);
ComponentToRemove.Append(FullColliisionArray[FindedIndex + 1].Collisions);
for (uint16 RemoverCounter = 0; RemoverCounter < ComponentToRemove.Num(); RemoverCounter++) {
OutArray().Remove(ComponentToRemove[RemoverCounter]);
}
}
return TArray<UPrimitiveComponent*>(OutArray());
}
TArray<USplineMeshComponent*> USplineMeshControl::FindSplineMeshByOverlapedComponent_C(TArray<UPrimitiveComponent*> InputComponent, TArray<FSplineMeshCollisions> FullCollisionsArray)
{
TArray<USplineMeshComponent*> OutSplineMeshes{};
for (uint16 struct_counter = 0; struct_counter < FullCollisionsArray.Num(); struct_counter++) {
for (uint16 collision_counter = 0; collision_counter < InputComponent.Num(); collision_counter++) {
if ((FullCollisionsArray[struct_counter].Collisions.Find(Cast<UBoxComponent>(InputComponent[collision_counter]))) != -1) {
OutSplineMeshes.AddUnique(FullCollisionsArray[struct_counter].SplineOwner);
}
}
}
return TArray<USplineMeshComponent*>(OutSplineMeshes);
}
TArray<USplineMeshComponent*> USplineMeshControl::CheckSplineOverlaps_C(TArray<FSplineMeshCollisions> InputArray)
{
TArray<TEnumAsByte<EObjectTypeQuery>>CollisonQuery;
CollisonQuery.SetNum(6, true);
CollisonQuery[0] = EObjectTypeQuery::ObjectTypeQuery1;
CollisonQuery[1] = EObjectTypeQuery::ObjectTypeQuery2;
CollisonQuery[2] = EObjectTypeQuery::ObjectTypeQuery3;
CollisonQuery[3] = EObjectTypeQuery::ObjectTypeQuery5;
CollisonQuery[4] = EObjectTypeQuery::ObjectTypeQuery4;
CollisonQuery[5] = EObjectTypeQuery::ObjectTypeQuery12;
TArray<UBoxComponent*> TempBoxCollisions;
TArray<UPrimitiveComponent*> OverlapedCollisions{};
TArray<AActor*> ActorToIgnore{};
TArray<UPrimitiveComponent*> RightOverlapedComponents{};
TArray<USplineMeshComponent*> OverlapedSplineMeshes{};
for (int struct_counter = 0; struct_counter < InputArray.Num(); struct_counter++) {
TempBoxCollisions = InputArray[struct_counter].Collisions;
for (int collision_counter = 0; collision_counter < TempBoxCollisions.Num(); collision_counter++) {
if (IsValid(TempBoxCollisions[collision_counter])) {
FTransform CollisionTransform = TempBoxCollisions[collision_counter]->GetComponentTransform();
UKismetSystemLibrary::ComponentOverlapComponents(TempBoxCollisions[collision_counter], CollisionTransform, CollisonQuery, NULL, ActorToIgnore, OverlapedCollisions);
if (OverlapedCollisions.Num() != 0) {
RightOverlapedComponents = RemoveSelfAndCombinedComponents_C(OverlapedCollisions, InputArray[struct_counter], InputArray);
if (RightOverlapedComponents.Num() > 0) {
OverlapedSplineMeshes = FindSplineMeshByOverlapedComponent_C(RightOverlapedComponents, InputArray);
}
}
}
}
}
return TArray<USplineMeshComponent*>(OverlapedSplineMeshes);
}
The error is caused by
FindedIndex = FullColliisionArray.Find(CurrentSplineCollision);
I also think this action will also cause an error.
if ((FullCollisionsArray[struct_counter].Collisions.Find(Cast<UBoxComponent>(InputComponent[collision_counter]))) != -1) {
UE4 Error while compiling:
C:\Development\Engine\UE_4.26\Engine\Source\Runtime\Core\Public\Containers/Array.h(862) : error C2678: ??? “==”: ?? ??? ???, ?ਭ???騩 ??? ???࠭? ⨯? “const FSplineMeshCollisions” (??? ?ਥ??? ?८?ࠧ??? ???)
I also tried to add an operator after the structure as Steve Robb wrote about it in the subject:https://answers.unrealengine.com/questions/327390/view.html. But it started to cause such errors.
????????? ??????⥪? C:\Development\Develop\Digger\Digger 4.26\Intermediate\Build\Win64\UE4Editor\Development\Digger\UE4Editor-Digger-5619.lib ? ??ꥪ? C:\Development\Develop\Digger\Digger 4.26\Intermediate\Build\Win64\UE4Editor\Development\Digger\UE4Editor-Digger-5619.exp
[5/6] UE4Editor-Digger-5619.dll
????????? ??????⥪? C:\Development\Develop\Digger\Digger 4.26\Intermediate\Build\Win64\UE4Editor\Development\Digger\UE4Editor-Digger-5619.suppressed.lib ? ??ꥪ? C:\Development\Develop\Digger\Digger 4.26\Intermediate\Build\Win64\UE4Editor\Development\Digger\UE4Editor-Digger-5619.suppressed.exp
SplineMeshControl.cpp.obj : error LNK2019: ??뫪? ?? ??ࠧ??襭??? ???譨? ᨬ??? "bool __cdecl operator==(struct FSplineMeshCollisions const &,struct FSplineMeshCollisions const &)" (??8@YA_NAEBUFSplineMeshCollisions@@0@Z) ? ?㭪樨 "private: static class TArray<class UPrimitiveComponent *,class TSizedDefaultAllocator<32> > __cdecl USplineMeshControl::RemoveSelfAndCombinedComponents_C(class TArray<class UPrimitiveComponent *,class TSizedDefaultAllocator<32> >,struct FSplineMeshCollisions,class TArray<struct FSplineMeshCollisions,class TSizedDefaultAllocator<32> >)" (?RemoveSelfAndCombinedComponents_C@USplineMeshControl@@CA?AV?$TArray@PEAVUPrimitiveComponent@@V?$TSizedDefaultAllocator@$0CA@@@@@V2@UFSplineMeshCollisions@@V?$TArray@UFSplineMeshCollisions@@V?$TSizedDefaultAllocator@$0CA@@@@@@Z).
SplineMeshControl.cpp.obj : error LNK2019: ??뫪? ?? ??ࠧ??襭??? ???譨? ᨬ??? "class TArray<class UPrimitiveComponent *,class TSizedDefaultAllocator<32> > __cdecl OutArray(void)" (?OutArray@@YA?AV?$TArray@PEAVUPrimitiveComponent@@V?$TSizedDefaultAllocator@$0CA@@@@@XZ) ? ?㭪樨 "private: static class TArray<class UPrimitiveComponent *,class TSizedDefaultAllocator<32> > __cdecl USplineMeshControl::RemoveSelfAndCombinedComponents_C(class TArray<class UPrimitiveComponent *,class TSizedDefaultAllocator<32> >,struct FSplineMeshCollisions,class TArray<struct FSplineMeshCollisions,class TSizedDefaultAllocator<32> >)" (?RemoveSelfAndCombinedComponents_C@USplineMeshControl@@CA?AV?$TArray@PEAVUPrimitiveComponent@@V?$TSizedDefaultAllocator@$0CA@@@@@V2@UFSplineMeshCollisions@@V?$TArray@UFSplineMeshCollisions@@V?$TSizedDefaultAllocator@$0CA@@@@@@Z).
C:\Development\Develop\Digger\Digger 4.26\Binaries\Win64\UE4Editor-Digger-5619.dll : fatal error LNK1120: ??ࠧ??襭??? ???譨? ??????⮢: 2
The added operator looked like this:
...
USTRUCT(BlueprintType)
struct FSplineMeshCollisions
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
USplineMeshComponent* SplineOwner;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<UBoxComponent*> Collisions;
};
bool operator==(const FSplineMeshCollisions&, const FSplineMeshCollisions&);
...