У меня есть код, очень подобный этому:
LINT_rep::Iterator::difference_type LINT_rep::Iterator::operator+(const Iterator& right)const
{
return (this + &right);//IN THIS PLACE I'M GETTING AN ERROR
}
LINT_rep::Iterator::difference_type LINT_rep::Iterator::operator-(const Iterator& right)const
{//substracts one iterator from another
return (this - &right);//HERE EVERYTHING IS FINE
}
err msg: Error 1 error C2110: '+' : cannot add two pointers
Почему я получаю ошибку только в одном месте а не в обоих?
Добавление указателя запрещено в C ++, вы можете вычесть только два указателя.
Причина в том, что вычитание двух указателей дает логически объяснимый результат - смещение в памяти между двумя указателями. Точно так же вы можете вычесть или добавить целое число к указателю / из указателя, что означает «перемещать указатель вверх или вниз». Добавление указателя к указателю - это то, что трудно объяснить. Что будет представлять полученный указатель?
Если по какой-либо причине вам явно понадобится указатель на место в памяти, адрес которого является суммой некоторых других двух адресов, вы можете преобразовать два указателя в int
, добавить int
s и вернуть указатель. Однако помните, что это решение требует огромной заботы об арифметике указателей, и вам никогда не следует этого делать.
Вычитание двух указателей дает расстояние между ними. Каким будет результат добавления двух указателей?
Я полагаю, что в вашем примере результатом, которого вы ожидали, было добавление или вычитание указателя на смещение, которое нужно переместить, а не на другой указатель.
В C ++ вы можете вычесть 2 указателя (получая смещение в памяти между ними) или добавить указатель на целочисленное значение (перемещение указателя в другую ячейку памяти с увеличением на значение * sizeof (object_class)). Простое добавление 2 указателей не имеет смысла в C ++, но если вы уверены, что хотите добавить адреса 2 ячеек памяти, просто добавьте их как целые числа без знака (используя приведение типов).
Почему я получаю ошибку в одном месте, а не в обоих?
Даже если бы вам разрешили добавить два указателя, this:
return (this + &right);
указывал бы в никуда. Подумайте об этом - this может быть чем-то вроде 0x00123456, а &right будет где-то в том же диапазоне (0x000000..0x80000000 - то есть, например, 0x00321321). Если их сложить, то полученный адрес будет указывать очень далеко от обеих переменных (0x00123456 + 0x00321321 == 0x00444777, что будет слишком далеко от "this" и &right), вы можете попасть в зарезервированную память (0x8xxxxxxx на win) и т.д. Кроме того, указатели могут переполниться. Именно поэтому (возможно) это запрещено.
Если вы хотите добавить что-то к указателю, добавьте целое число.
742 Evergreen Terrace + 1 = 743 Evergreen Terrace
742 Evergreen Terrace - 1 = 741 Evergreen Terrace
743 Evergreen Terrace - 741 Evergreen Terrace = 2
743 Evergreen Terrace + 741 Вечнозеленая терраса = ???
Другие ответы уже объясняли, почему то, что вы делаете, не работает, но я предполагаю, что вы хотите определить типичный оператор +
для итератора, но потерялись в этой попытке.
И указатели, и стандартные итераторы с произвольным доступом позволяют продвигать указатель или итератор на целое значение. В случае итераторов определяется оператор +
, который принимает целое значение в качестве аргумента и возвращает итератор.
LINT_rep::Iterator LINT_rep::Iterator::operator+(int distance) const;
Вы можете определить такой оператор как метод, но этот метод позволит вам написать
iterator + distance
, но не
distance + iterator
. Чтобы сделать сложение коммутативным, вы должны определить другую функцию, не являющуюся членом, которая принимает расстояние как первую параметр и объект-итератор как второй
friend LINT_rep::Iterator LINT_rep::Iterator::operator+(int distance, const LINT_rep::Iterator & rhs);