ошибка: нет соответствия для «operator‹‹» (типы операндов — «std::ostream» {он же «std::basic_ostream‹char›»} и «std::_List_iterator‹int›»)

Здравствуйте, я пытаюсь напечатать список целых чисел, и я продолжаю получать эту ошибку.

У меня есть структура, в которой есть список.

struct faceFiguration{

    int faceID;
    list<int> setofVertices;

};

И у меня есть список этой структуры

 list<faceFiguration> pattern;

и здесь, где я запутался, я пытаюсь напечатать списки здесь:

void PrintFaces(){

      currentFace = pattern.begin();
      while(currentFace != pattern.end()){

        cout << currentFace -> faceID << endl;

        for(auto currentVertices = currentFace->setofVertices.begin(); currentVertices != currentFace->setofVertices.end(); currentVertices++){

          cout << currentVertices;

        }

        cout << '\n';
        currentFace++;
      }

    }

Это полная ошибка сообщения

error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘std::__cxx11::list<int>’)


person Oscar Flores    schedule 02.03.2021    source источник
comment
Сообщения об ошибках в заголовке и внизу вопроса не совпадают, опечатка?   -  person churill    schedule 02.03.2021


Ответы (4)


Вы уже получили ответы, говорящие вам разыменовать итератор:

for(auto currentVertices = currentFace->setofVertices.begin();
    currentVertices != currentFace->setofVertices.end();
    currentVertices++)
{
    cout << *currentVertices;   // dereference
}

Однако вы можете сделать это автоматически, используя цикл for на основе диапазона:

for(auto& currentVertices : currentFace->setofVertices) {
    cout << currentVertices;    // already dereferenced
}
person Ted Lyngmo    schedule 02.03.2021

Я не думаю, что сообщение об ошибке действительно относится к строке, которая вызывает здесь проблему (вы пытались << создать сам список раньше?), но

cout << currentVertices;

пытается вызвать operator << со ссылкой std::ostream (std::cout) и итератором в std::list. Это не работает, потому что тип итератора не имеет этого оператора (зачем он должен). Однако итераторы смоделированы по образцу указателей и, следовательно, позволяют разыменовываться для доступа к элементу, на который они ссылаются. Короче говоря; это должно работать:

cout << *currentVertices;

где * перед currentVertices является разыменованием и дает int& (ссылка на базовый элемент списка).

person lubgr    schedule 02.03.2021

currentVertices здесь итератор. Это объект, который действует как указатель. Вы не можете распечатать его с помощью cout. Но да, вы можете распечатать значение, на которое указывает итератор. Для этого вам нужно поставить * перед итератором. То есть *currentVertices. (Читать как content of currentVertices)

Итак, резюме такое

  1. currentVertices — это итератор (или указатель, если хотите), а *currentVertices — это content of that iterator.
  2. Вам нужно cout content of iterator, а не iterator
person yuv    schedule 02.03.2021
comment
Согласитесь, просто! Вы могли напечатать указатель, перегрузив <<, что не очень хорошая идея, но возможно :D - person Ivan; 02.03.2021
comment
Да, но я постарался ответить как можно проще. Поэтому я избежал перегрузки оператора и остался с оператором по умолчанию. - person yuv; 02.03.2021
comment
Спасибо!! ты спас мою жизнь - person Oscar Flores; 02.03.2021

Как уже упоминалось другими

 cout << currentVertices;

пытается напечатать итератор. Но нет перегрузки для operator<<, которая принимает второй параметр этого типа. Либо разыменуйте итератор

 //      V
 cout << *currentVertices;

или упростить весь цикл:

for(const auto &currentVertices : currentFace->setofVertices){
    cout << currentVertices;
}
person churill    schedule 02.03.2021
comment
Спасибо!!! это сработало :D - person Oscar Flores; 02.03.2021