在下面的代码中,我将指针类型转换为引用指针类型,以便将指针更改为指向其他位置:
inline void SWAP_POINTERS(void*& p1,void*& p2)
{
void* temp = p1;
p1 = p2;
p2 = temp;
}
当我调用该函数时,我发现以下错误:
note: candidate function not viable: no known conversion from 'int32_t *' (aka 'int *') to 'void *&' for 1st argument
我需要演员吗? 为什么我需要施放,因为它是无效的??
限制:没有模板。
调用这样的代码:
unsigned int* a;
double* b;
SWAP_POINTERS(a,b);
答案 0 :(得分:4)
<强> 1。一旦你在交换后取消引用其中一个指针,你可能会破坏严格的别名。
unsigned int* a;
double* b;
SWAP_POINTERS(a,b);
不要交换指向不同类型的指针。 (注意char
别名是其他类型,但这是一个例外。)
<强> 2。您无法隐式地将int*
转换为void*&
。
int*
可隐式转换为void*
,但转换会创建一个无法绑定到左值引用的右值。
为了将SWAP_POINTERS
与问题中显示的签名一起使用,必须先创建void*
类型的左值,然后将其传递给SWAP_POINTERS
。
示例:
int a{0}, b{1};
int * pa = &a;
void * vpa = pa;
int * pb = &b;
void * vpb = pb;
SWAP_POINTERS(vpa, vpb); // swaps vpa and vpb - OF COURSE :)
请注意,这并不能解决使用最少代码(无关)指针的交换(可能是有意的)。它只是解释为什么原始代码void*&
在传递int*
时不起作用,以及如何调用原始函数以便能够操作(在其函数上)参数...)。
第3。通过std::swap
int a{0}, b{1};
int * pa = &a;
int * pb = &b;
std::swap(pa, pb);
答案 1 :(得分:0)
这会做你想要的,但完全不推荐。模板(或std::swap
)确实是正确的答案。
首先,定义内联函数以取void **
inline void SWAP_POINTERS2(void** p1,void** p2)
{
void* temp = *p1;
*p1 = *p2;
*p2 = temp;
}
然后,定义一个宏来执行令人不快的演员表。
#define SWAP_POINTERS(a,b) SWAP_POINTERS2((void **) &a, (void **) &b)
或者,如果您更喜欢使用static_cast
:
#define SWAP_POINTERS(a,b) SWAP_POINTERS2(static_cast<void**>(static_cast<void *> (&a)), static_cast<void**>(static_cast<void *>(&b)))
现在这个&#34;工作&#34;在某种程度上,它编译并做你想要的。我不知道你如何使用交换指针,当然......
unsigned int* a;
double* b;
SWAP_POINTERS(a,b);