Назначение указателя в C++. (Указатель на указатель на указатель находится на LHS)

IDirect3DSurface9 *var = NULL;

IDirect3DSurface9 *** ret;

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

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

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

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

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

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

3 ответа

Решение

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

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

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

И ясно, что *(*(ret[0])) не совместим с var который имеет тип IDirect3DSurface9*,

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

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

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

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

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

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

или же

*(*(*(ret[0]))) = var;
Другие вопросы по тегам