2015-09-15 3 views
6

Я получаю эту ошибкуРазыменование дает строку итераторов Int

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

Для следующего кода

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

Почему разыменований выход строки итератора в int и не std::string?

+0

Вы должны написать 'cout << ((* i)! = 'S') << endl;' (обратите внимание на одинарные кавычки). –

+0

Вы сравниваете символ ('* i') с указателем на строку (' 's ''). Это не сработает. –

+0

, если вы используете 'auto' уже, почему бы не использовать range-for, как в' for (auto const & c: s) {cout << (c! = 'S') << '\ n'; } '? (обратите внимание, что вы редко хотите использовать 'endl' и чаще всего' \ n') – TemplateRex

ответ

8

На самом деле, он не дает int, он дает char (потому что итератор строк итерации над символами в строке). С другой операнд != не char (это const char[2]), стандартные акции и преобразования применяются к аргументам:

  • char повышен до int с помощью интегрального продвижения
  • const char[2] преобразуется в const char* через массив -в-указатель преобразования,

Это, как вы прибудете на int и const char* операнды компилятор жалуется.

Вы должны сравнить разыменованный итератор к характеру, не к строке:

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

"" замыкает строковый литерал (тип const char[N]), '' охватывающей литера (типа char).