Итератор C ++ для вектора структуры Ошибка компилятора Ask - PullRequest
0 голосов
/ 10 сентября 2018

почему этот код работает с аргументом функции?

void GameBoard::showField(std::vector<int> newBoard) const {
    for (std::vector<int>::iterator it = newBoard.begin(); it < newBoard.end(); it++) {
        std::cout << ' ' << *it;
    }
    std::cout << '\n';
}

, если свойство класса не работает

void GameBoard::showField() const {
    for (std::vector<int>::iterator it = this->board.begin(); it < this->board.end(); it++) {
        std::cout << ' ' << *it;
    }
    std::cout << '\n';
}

1 Ответ

0 голосов
/ 10 сентября 2018

Ваш аргумент функции - std::vector<int>. Таким образом, .begin() дает вам хороший std::vector<int>::iterator. Это соответствует использованию в вашем цикле.

Однако ваш член, при доступе через const функцию члена, такую ​​как showField, также является const. Сейчас в этом контексте const std::vector<int>. Таким образом, .begin() дает вам std::vector<int>::const_iterator.

Вы явно выписали std::vector<int>::iterator, и эти два не совпадают.

Вы не изменяете значения, поэтому просто придерживайтесь std::vector<int>::const_iterator или, знаете, auto.

Я имею в виду, что вы действительно хотите это:

void GameBoard::showField() const
{
   for (const auto& el : board)
      std::cout << ' ' << el;

   std::cout << '\n';
}

В идеале, взять поток в качестве аргумента:

std::ostream& GameBoard::showField(std::ostream& os) const
{
   for (const auto& el : board)
      os << ' ' << el;

   os << '\n';
   return os;
}

Теперь мы говорим.

...