Assignment should be identical to instantiation with the sole exception that you replace whatever default value you give the data with the values of another of the same type. Or in the literal case, of the type T*.
A = b doesn't make sense at all because you're assigning type T to a vector, which you shouldn't be doing. Don't overload the array index operators. If you you absolutely need them, create functions like " T vector::xComp() const", "T vector:: yComp() const", etc, but the idea would be that the user of vector or matrix think of them as a single entity.
You won't need to worry about casting contents to different types if you templatize your class definitions.
The only operators you should be defining are (where a, b are vectors/matrices and c is type T): a=b, a+b, a-b, a*c, a/c +a, -a, a==b, a!=b, a+=b, a-=b, a*=c, a/=c. Every other operator doesn't have a clear meaning for each data type. Eg, does a*b mean dot product or cross product?
I'd also avoid calling it "vector"; it will lead to confusion even if you didn't bring the standard libraries into default scope.
I can't really give you too much more help unless you post some of your code.