I can't compile your code with VC++ 9 because it's an example of ill-formed C++ program.
If you define (wrong) copy constructor with
Vector<F>& argument, it's impossible to initialize Vector<float> variable with Vector<double> initializator.
The only possible way to do that is:
1. Convert Vector<double> object to temporary Vector<float> object.
2. Use Vector<float> copy constructor with
const Vector<float>& parameter, because C++ forbid to bind non-const reference to temporary objects.
No such constructor: you define your own copy constructor with non-const reference.
If you discard user-defined copy constructor, default (compiler generated) copy constructor will be used, that's OK.
If you discard conversion operator, you can't compile the program again (no copy constructor Vector<float> with
const Vector<double> argument).
Summary: always define copy constructors with const arguments
Vector(const Vector<F>& source)
(except special cases when you know what happens

)...