I write my (native) libs and apps in plain C. I'm happy. I considered, maybe twice after just playing, to migrate to C++, but realized that the features I actually required were provided by C already. I'm sure some people actually need C++ (instead of C) for the same reasons that I need C (instead tof asm, if we ignore portability) myself. Some people need C# (instead of C++). I wouldn't mind namespaces, I haven't needed templates, I cannot stand references, I despise operator overloading.
You never "need" a language. All languages we discuss here are Turing complete, so you can select whatever you please, and every project can be equally well done in C, C++, assembly or Pascal (for the sake of the argument).
The question is rather, how well can you express your architecture with a given language, and how expressive the language is in supporting you. Namespaces help to isolate symbol sets from each other, which helps a lot if your project depends on a lot of other contributions to avoid conflicts in naming. References are more expressive than pointers as they cannot be NULL. The syntax ensures that you cannot pass "empty" references. Operator overloading should only be used were natural, and that is in mathematics or numerics. If you don't do that, don't use them - though "functor" objects do come handy (classes that overload operator() and can be used as functions). Templates can be very handy to generate very fast code as they use the compiler as code generator. Instead of writing the code multiple times, you only write it once, and let the compiler do the job. Simpler to write, simpler to maintain, excellent results.
Of course, one can overdo it. Operator overloading: At the time the STL was designed, "operator overloading" was the new kid on the block, and it was used as essential element in the I/O functions. However, the result is not only harder to read, it is also less flexible than "printf and friends". If I want to localize a program, all I need to do is to localize the "printf format string". With some extended syntax, it can even reshuffle its arguments. "cout << " is less expressive and cannot do that, and its "manipulator syntax" is kludgy and less handy.
Net result: I don't use this stuff. The good thing about C++ is: You don't have to. "
" exists, and continues to work. This is quite different from other languages. If you don't like "type erasure" in java, then that's just your bad luck.