Personally, the most hideous problem I have seen is the invocation of template functions in dependent context:
template <typename T>
void foo(T t) {
t.bar<3>();
}
This looks admittedly simple, but in fact is incorrect. The C++ Standard requires the introduction of the template keyword to disambiguate t.bar < 3 vs a method invocation yielding:
t.template bar<3>(); // iirk
litb made some very interesting posts regarding the possible interpretation a compiler could come up with.
Regarding the >> issue, it’s fixed in C++0x, but requires more clever compilers.