ENGINE_API is just a macro which is expanded to __declspec(dllimport). When applied to a class, it is automatically applied to all its member functions. When applied to a member function of a class template, implicit instantiation of definition of the given member function will be suppressed, because the definition of a member function of a class template specialization is then supposed to be obtained from an external library. If external library does not provide the definition having exactly the same signature (which is distinguished by mangled function name), linking to the function fails.
When a member function of a class template is declared with dllexport (which can be achieved by declaring the whole class with dllexport), presence of the generic definition of the function is not sufficient for exporting any of its specializations. If you want to export a specialization (an instance) of a member function of a class template with a particular template-argument-list, you have to instantiate it. I don't remember if implicit instantiation is enough, but explicit instantiation should work. For a particular function it would be something like this:
template void TArray<unsigned char>::Remove(int, int);
// instantiates the definition of the member function of TArray<unsigned char> from the generic definition
It is also possible to explicitly instantiate the whole class:
template class TArray<unsigned char>;
// instantiates the whole class TArray<unsigned char> from the class template definition
Not sure if __declspec(dllexport) has to be present in either case.
Now about removing ENGINE_API. By removing __declspec(dllimport) for a particular function you allow implicit instantiation of the function definition from the generic definition available in the corresponding header file (so the current module will use its own definition of the function rather than expect that an external library will provide it). Then you must ensure that if several modules operate on the same object, the operations are consistent across modules. In particular, all modules shall use the same heap for memory allocations and deallocations.