2015-09-15 23 views
6

otrzymuję ten błąddereferencing plony ciąg iteracyjnej int

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

Na poniższym kodzie

#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; 
    } 
} 

Dlaczego dereferencing iterator ciąg uzyskując int i nie std::string?

+0

Powinieneś napisać 'cout << ((* i)! = 'S') << endl;' (zanotuj pojedyncze cytaty). –

+0

Porównujesz znak ('* i') ze wskaźnikiem do ciągu znaków (' 's" '). To nie działa. –

+0

jeśli używasz 'auto' już, dlaczego nie używać range-for jak w' for (auto const & c: s) {cout << (c! = 'S') << '\ n'; } '? (zauważ, że rzadko chcesz używać 'endl' i najczęściej' \ n') – TemplateRex

Odpowiedz

8

Właściwie to nie daje int, daje char (ponieważ iterator ciągu iteruje po znakach w łańcuchu). Od drugiego argumentu operacji z != nie jest char (to const char[2]) standardowe promocji i konwersji, są stosowane do argumenty

  • char jest podnoszony do int poprzez Integralna
  • const char[2] przekształca się const char* poprzez wybór -to-wskaźnik konwersji,

w ten sposób można dotrzeć do int i const char* Operandy kompilator narzeka.

należy porównać dereferencjonowane iterator do charakteru nie do ciąg:

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

"" otacza ciąg dosłowne (typ const char[N]) '' otacza charakter dosłowny (typ char).