That's because dereferencing the pointer means you are comparing the value of one character with the address in memory of another character. Such comparisons don't make sense, so compilers reject them.
No. The result of string::c_str() is a pointer. If you use the comparison operators on it, you are doing a pointer comparison. If you want to compare the data that pointer points at with the data pointed at by another pointer (eg a string literal) then use strcmp().