APlayerCharacter is already a class. So if you create a class with that name the compiled gets confused. Just to make you mad because you did the same to it.
What you’re expecting here is that your array types are covariant, which is something that languages like C# and Java have implemented for their generic types. However, C++ templates are not generics and do not support covariance just like that. What you get in C++ is that your TArray<ABaseCharacter*> and TArray<APlayerCharacter*> classes are two completely separate copies of the TArray template with no direct conversion defined between them. You can still add an APlayerCharacter* to your TArray<ABaseCharacter*> because APlayerCharacter inherits from ABaseCharacter, but that doesn’t mean that the TArray<APlayerCharacter*> class automatically inherits from the TArray<ABaseCharacter*> class.
For future generations: the correct answer is Nico’s. C++ templates aren’t covariant, so even if the type parameters are derived, you can’t assign one to the other.