#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())
uselines_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()) ))