C ++: невозможно преобразовать из foo & в foo * - PullRequest
3 голосов
/ 10 июня 2010

У меня есть метод:

odp(foo& bar);

Я пытаюсь вызвать его:

foo baz;
odp(&baz);

Я получаю ошибку компилятора:

error C2664: "odp" cannot convert parameter 1 from 'foo *' to 'foo &'

Чтоя делаю не так?Разве я не передаю ссылку на baz?

ОБНОВЛЕНИЕ : Возможно, у меня неправильное представление об отношениях между указателями и ссылками.Я думал, что они были одинаковыми, за исключением того, что ссылки не могут быть нулевыми.Это неправильно?

Ответы [ 7 ]

7 голосов
/ 10 июня 2010

Когда вы применяете унарный оператор & к объекту, вы получаете указатель на этот объект, а не ссылку . Вам нужна ссылка в этом случае. Чтобы инициализировать ссылочный параметр, вам вообще не нужно применять какие-либо операторы: объект lvalue может немедленно использоваться сам по себе для инициализации ссылки соответствующего типа.

Неформальная синонимия между понятиями «указатель» и «ссылка» (как в «передача по указателю» и «передача по ссылке») характерна для языка Си. Но в C ++ они означают две совершенно разные вещи.

4 голосов
/ 10 июня 2010

Функция odp нуждается в ссылке на переменную foo, тогда как вы передаете адрес переменной foo (указатель).

Просто пройдите baz как:

foo baz;
opd(baz);

И это скомпилируется.

2 голосов
/ 10 июня 2010

Когда вы используете & baz, вы фактически произносите адрес baz, поэтому передаете указатель.

2 голосов
/ 10 июня 2010

Нет, вы передаете указатель на baz.Бросьте &.

1 голос
/ 10 июня 2010

В C ++ ссылками являются псевдонимы, не адреса. Например, вы можете иметь несколько имен для одного указателя, так же как вы можете иметь несколько имен для одного реального объекта.

Когда вы объявляете функцию, принимающую ссылочный параметр, она автоматически присваивает псевдоним любой переменной, которую вы ей передаете. Как бы то ни было, псевдонимы должны быть того же типа, что и ссылка. В вашем случае вы используете псевдоним int* со ссылкой int, что не имеет смысла.

1 голос
/ 10 июня 2010

Ссылки и указатели НЕ одинаковы в C ++ - хотя вы, вероятно, читали, что большинство компиляторов реализуют ссылки с использованием указателей на уровне машинного кода.Вам не нужно заботиться о том, как они реализованы компилятором - но какова семантика «ссылки» и «указателя» в C ++.

int i = 5;
int &j = i;  // j refers to the variable i
// wherever the code uses j, it actually uses i
j++;  // I just changed i from 5 to 6
int *pj = &i;  // pj is a pointer to i
(*pj)--;  // I just changed i back to 5

Обратите внимание, что я могу изменить pj на точкуна другое целое число, но я не могу изменить ссылку j для ссылки на другое целое число.

int k = 10;
pj = &k;  // pj now actually points to k
(*pj)++;  // I just changed k to 11
j = k;  // no, this doesn't change the reference j to refer to k instead of i,
// but this statement just assigned k to i, that is, i now equals 11!
0 голосов
/ 10 июня 2010

Может быть, вас вводят в заблуждение старые соглашения C? В C вы «передаете по ссылке» путем создания указателя, поскольку в языке нет ссылок - вы используете указатель для «ссылки» на исходную переменную. В C ++ ссылки поддерживаются языком , и нет необходимости создавать указатель на переменную при вызове функции.

foo baz; 
odp(baz); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...