Как привести указатель в C ++ - PullRequest
3 голосов
/ 20 января 2009
void foo(void **Pointer);

int main ()
{
    int *IntPtr;

    foo(&((void*)IntPtr));
}

Почему я получаю ошибку?

error: lvalue required as unary ‘&’ operand

Спасибо

Ответы [ 5 ]

8 голосов
/ 20 января 2009
void foo(void **Pointer);

int main ()
{
    int *IntPtr;

    foo((void**)&IntPtr);
}
7 голосов
/ 20 января 2009

Когда вы делаете

(void*)IntPtr

вы создаете временную переменную, которая является только значением и поэтому не может быть разыменована.

Что вам нужно сделать, это:

int main()
{
  int* IntPtr;
  void* VoidPtr = (void*)IntPtr;
  foo(&VoidPtr);
}

или эквивалент

4 голосов
/ 20 января 2009

(void *) - это не lvalue, это своего рода оператор приведения, вам нужно иметь амперсанд слева от переменной (lvalue). Это должно быть правильно:

foo(((void**)&IntPtr));
2 голосов
/ 21 января 2009

Как отмечают другие, у вас неправильный порядок приведения, а &. Но почему вы вообще используете void**? Это означает, что вы принимаете указатель на пустой указатель . Но это совсем не то, что вы хотите. Просто сделайте параметр void*, и он примет любой указатель на некоторый объект:

void foo(void*);

int main () {
    int *IntPtr;
    foo(&IntPtr);
    assert(IntPtr == NULL);
}

Вот для чего void*. Позже, бросьте его обратно, используя static_cast. Это довольно ограниченное приведение, которое не допускает опасных вариантов, в отличие от преобразования в стиле C (type) :

void foo(void* p) {
    int** pint = static_cast<int**>(p);
    *pint = NULL;
}

Если функция принимает указатели на void*, то эта функция не может принимать указатели на int*. Но если функция принимает либо или, то функция должна принять void*, и вы должны привести к нужному типу внутри функции. Может быть, вставить то, что вы действительно хотите сделать, тогда мы можем помочь вам лучше. В C ++ есть несколько хороших инструментов, в том числе шаблоны и перегрузка, которые в этом случае кажутся полезными.

2 голосов
/ 20 января 2009

Больше стиля C ++:

foo( reinterpret_cast< void** >( IntPtr ) );

Но помните, в соответствии со стандартом такое приведение зависит от реализации. Стандарт не дает никаких гарантий о поведении такого актера.

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