Назначение указателя в C ++. (Указатель на указатель на указатель находится на LHS) - PullRequest
0 голосов
/ 22 марта 2012
IDirect3DSurface9 *var = NULL;

IDirect3DSurface9 *** ret;

Я хочу присвоить значение, разыменованное var, в переменную, указанную в ret.

Я сделал следующее:

(*(*(ret[0]))) = var;

Мне кажется, это правильный синтаксис C ++. Но почему я получаю ошибку компиляции следующим образом:

ошибка C2679: бинарный '=': не найден оператор, который берет правую руку операнд типа "IDirect3DSurface9 *" (или это неприемлемо преобразование). * * 1 010

Какой правильный синтаксис?

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Вы трижды ссылались на указатель.Один раз, когда вы рассматриваете его как массив и используете индекс [0], а затем еще два раза с оператором *.Чтобы быть совместимым с var, вы должны отменить ссылку только дважды.

Чтобы быть более точным, давайте разберем это:

  • ret имеет тип IDirect3DSurface9***.
  • ret[0] имеет тип IDirect3DSurface9**.
  • *(ret[0]) имеет тип IDirect3DSurface9*.
  • *(*(ret[0])) имеет тип IDirect3DSurface9.

И из этого следует, что *(*(ret[0])) несовместимо с присвоением var, имеющим тип IDirect3DSurface9*.

Что касается того, каким должен быть ваш код, я не могу сказать наверняка,но вам нужно будет удалить один уровень косвенности.

2 голосов
/ 22 марта 2012

Каждый * и [] убирает один уровень косвенности.Таким образом, в вашем коде

(*(*(ret[0]))) = var; 

левая сторона имеет тип IDirect3DSurface9, а правая сторона имеет тип IDirect3DSurface9 *.Два типа различаются, поэтому вы получаете ошибку компилятора.Вам необходимо исправить это, удалив (хотя бы один) * из LHS или добавив & (оператор адреса) к RHS (чтобы иметь &var).

0 голосов
/ 22 марта 2012

Вы, вероятно, хотите:

(*(*(ret[0]))) = &var;

или

*(*(*(ret[0]))) = var;
...