I think you can omit the <> block if passed arguments tell the type(ie. here).
Yes you can drop it. Depending on the design decisions you make, you might want to emphasize the type, so you'd for instance notice at compile time when you actually passed a float variable instead of integer instead of later seeing the problem occur at runtime. But it's up to you and for the given examples it doesn't really make sense.
You don't need to fully understand how the function works to use it.
http://foldoc.org/Voodoo
You have no idea what kinds of stuff can happen when you say that..
The idea behind this is abstraction. If I know how to use it and if I know what the final result will be, then it doesn't matter
for me what the 'black box' does.
You can argue around as you want, but in the end you're constantly using abstraction and it's (mostly) a good thing. For example you're using SFML without know how every little tiny detail works inside SFML, or you're using the STL without knowing how they really did it, or you're using C++ without even knowing how the compiler creates the machine code for every given compiler flag etc, or you're using the compiled machine code without knowing how
your processor actually works inside, etc. etc.
So abstraction
is a good thing.
For the function at hand, if we tell him the interface (usage), what the result will be and what can't be done with the function, then there's no need for him to fully understand how it works at this given moment.
Obviously it's essential for progressing with C++ to get to know things like templates but just because you don't understand them (yet) doesn't imply you can't use them and if you do the whole world would explode.