Ошибка компилятора инструкции C

#c #iterator

#c #итератор

Вопрос:

в моей программе есть инструкция, которая выполняет сравнение элементов двух векторов

  if(!*(it2 3).compare(*(lines_in_file.begin())))
  

ошибка компилятора, которую я получаю, является:

 test_file.cpp:140: error: 'class __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >' has no member named 'compare'
  

it2 тип является :

 vector<std::string>::iterator it2=rec_vec.begin();
  

lines_in_file тип равен :

 vector<std::string> lines_in_file=split(argv[2],',');
  

объявление разделяемой функции является :

 std::vector<std::string> split(const std::string amp;s, char delim)
  

Я немного запутался. уже потратил много времени на размышления.
кто-нибудь может, пожалуйста, помочь?

Комментарии:

1. Просто разбейте это огромное выражение уже. Посчитайте: это сбивает с толку ВАС даже больше, чем компилятор, и теперь на исправление ваших ошибок уходит МОЕ время. ОТ: я думаю, вы заново изобретаете алгоритмы diff. Не делайте этого. Используйте библиотеку.

2. Хороший компилятор выдал бы предупреждение о «нечитаемом коде»! Вы платите за то, что время от времени нажимаете пробел?

3. Не используйте std::string::compare , используйте оператор != . Не используйте *(lines_in_file.begin()) use lines_in_files.front() . Попробуйте использовать const_iterator , если это возможно (не знаю, какой вариант использования здесь)…

Ответ №1:

Проблема в том, что оператор «.» имеют больший приоритет, чем «*», так что это должно решить проблему.

 if(!(*(it2 3)).compare(*(lines_in_file.begin())))
  

Комментарии:

1. Чтобы уточнить, operator . имеет более высокий приоритет, чем operator * . Добавление круглых скобок дает требуемый синтаксический анализ.

Ответ №2:

Это происходит потому, что . оператор имеет более высокий приоритет, чем * operator. Используйте это:

 if(!(it2 3)->compare(*(lines_in_file.begin())))
  

или это

 if(!(*(it2 3)).compare(*(lines_in_file.begin())))
  

(которые равны)

Ответ №3:

Оператор * применяется к результату

 (it2 3).compare(*(lines_in_file.begin()))
  

Это не то, что вы хотите. Просто используйте ():

 (*(it2 3)).compare(*(lines_in_file.begin()))
  

Комментарии:

1. Вау. Похоже, мы все отреагировали одновременно! :]

Ответ №4:

Приоритет оператора доступа к элементу ( . ) выше, чем приоритет оператора косвенного обращения ( * ). Итак, ваш код интерпретируется как:

 if(!*( (it2 3).compare( *(lines_in_file.begin()) ) ))
  

Отсюда и ошибка. (для наглядности добавлены дополнительные пробелы)

Итак, исправление заключается в следующем:

 if(! ( *(it2 3) ).compare( *(lines_in_file.begin()) ))