So one thing I noticed is that if I make m_tItems a pointer, then I can do "(*m_tItems)[i]->DoStuff()" and it works fine. But I do not understand why this works while it doesn't with a non-pointer version.
(Also, I tried with a simple int instead of u32, and, with no surprise, it didn't work)

Does anyone have any idea what I did wrong please? And, if not trivial, why is it wrong?

(Sorry if this has been answered already, I tried searching for a similar issue but found nothing that looks like this issue)

Note that this overloading is not specific to operator[], but rather all methods (which can be overloaded by const or non-const).

The reason you need the const version in your code is that DoSomething() is declared const, thus this is const TOtherClass* within that method, and by extension all its members, notably m_tItems here, are const within the method, and so only const methods can be called on them. Since there is no const version of operator[] defined for m_tItems, the compiler gives you that error.