Revised: What is your favorite programming language?
In my experience, having a sufficiently dynamic type system (like ObjC provides with 'id') completely negates the need for templates.
Operator overloading is nice for writing your own math classes (Vector, Quaternion, etc) but is almost completely useless outside that domain, and can scarcely be called "necessary" even within it. Lua and Python and Ruby all provide it, anyway.
The inability to call any method on any object is the biggest strike against the usability of C++ for a large project. It means you have to constantly fight the static type system, and constantly add new abstract classes to the inheritance hierarchy, and constantly name methods in ways you didn't want. Either that or extend the type system, eg. like Qt's MOC does, but by then, you might as well not be using C++.
The lack of garbage collection is also a big deal. By the time you've found all the memory leaks and crashes caused by trying to share an object between multiple "owners", you've wasted a lot of time. Yes, you can reference-count it, yes, you can use various kinds of automatic smart pointer, but it doesn't completely alleviate the problems, and it is plenty of extra work.
Remember, there's nothing sort of "inherently wrong" with C++, any more than there is with Pascal, or Ada, or whatever... it's the sum of many smaller irritations.
The big picture is, of course, what I said in my first post -- you want fast code? use C. You want easy-to-write code? Use Python or Ruby. You want both in the same app? No problem -- embed the little C you require. C++ is a poor compromise for either goal.
Operator overloading is nice for writing your own math classes (Vector, Quaternion, etc) but is almost completely useless outside that domain, and can scarcely be called "necessary" even within it. Lua and Python and Ruby all provide it, anyway.
The inability to call any method on any object is the biggest strike against the usability of C++ for a large project. It means you have to constantly fight the static type system, and constantly add new abstract classes to the inheritance hierarchy, and constantly name methods in ways you didn't want. Either that or extend the type system, eg. like Qt's MOC does, but by then, you might as well not be using C++.
The lack of garbage collection is also a big deal. By the time you've found all the memory leaks and crashes caused by trying to share an object between multiple "owners", you've wasted a lot of time. Yes, you can reference-count it, yes, you can use various kinds of automatic smart pointer, but it doesn't completely alleviate the problems, and it is plenty of extra work.
Remember, there's nothing sort of "inherently wrong" with C++, any more than there is with Pascal, or Ada, or whatever... it's the sum of many smaller irritations.
The big picture is, of course, what I said in my first post -- you want fast code? use C. You want easy-to-write code? Use Python or Ruby. You want both in the same app? No problem -- embed the little C you require. C++ is a poor compromise for either goal.

