Как отмечают другие, у вас неправильный порядок приведения, а &
. Но почему вы вообще используете 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 ++ есть несколько хороших инструментов, в том числе шаблоны и перегрузка, которые в этом случае кажутся полезными.