Чтобы понять, в чем проблема, давайте представим, что вместо этого вы написали этот код:
void addNeighbour(Element*& neighbour)
{
m_neighbours.emplace_back(neighbour);
neighbour->addNeighbour(this);
neighbour = nullptr; // <--- This is new
}
Теперь подумайте о том, что происходит, когда вы делаете этот вызов:
neighbour->addNeighbour(this);
вызов функции передается в this
по ссылке, что означает «пожалуйста, не стесняйтесь переназначить this
». И затем в вызове функции последняя строка действительно пытается переназначить neighbour
на nullptr
. Но это проблема, потому что вы не можете написать
this = nullptr; // Error!
, потому что this
- это значение.
Самое простое решение здесь - не брать параметр по ссылке, так как вы ничего не делать, если вам действительно нужна ссылка. Просто наберите Element*
, сказав: «Пожалуйста, передайте мне копию нужного вам указателя».
(Независимо - ваш код доставит вам неприятности, потому что вызов A->addNeighbour(B)
вызовет B->addNeighbour(A)
, который вызывает A->addNeighbour(B)
, который вызывает B->addNeighbour(A)
и т. д. c., пока вы не выбросите свой стек вызовов. Вы должны добавить проверку здесь, чтобы убедиться, что, если Element
уже записано, вы не Не добавляйте его во второй раз. Вы можете сделать m_neighbours
std::unordered_set
вместо std::vector
для этой цели.)