2015-09-15 18 views
6

ottengo questo erroredereferencing rendimenti stringa iteratore int

comparison between pointer and integer ('int' and 'const char *') 

Per il seguente codice di

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    std::string s("test string"); 
    for(auto i = s.begin(); i != s.end(); ++i) 
    { 
     cout << ((*i) != "s") << endl; 
    } 
} 

Perché il dereferencing all'iteratore stringa di cedere un int e non std::string?

+0

Si dovrebbe scrivere 'cout << ((* i)! = 'S') << endl;' (notare le virgolette singole). –

+0

Si sta confrontando un carattere ('* i') con un puntatore a una stringa (' "s" '). Questo non può funzionare. –

+0

se si usa già 'auto', perché non usare range-for come in' for (auto const & c: s) {cout << (c! = 'S') << '\ n'; } '? (nota che raramente vuoi usare 'endl' e molto spesso' \ n') – TemplateRex

risposta

8

In realtà, non produce uno int, produce uno char (perché un iteratore di stringa itera sui caratteri nella stringa). Poiché l'altro operando di != non è char (è un const char[2]), promozioni standard e le conversioni sono applicati agli argomenti:

  • char viene promosso int tramite promozione integrale
  • const char[2] viene convertito const char* tramite matrice conversione-to-pointer,

Questo è come si arriva alla int e const char* operandi il compilatore si lamenta.

si dovrebbe confrontare l'iteratore Dereferenced ad un personaggio , non una stringa :

cout << ((*i) != 's') << endl; 

"" racchiude una stringa letterale (tipo const char[N]), '' racchiude un carattere letterale (tipo char).