我有一个用于删除缓冲区的函数。指针通过地址传递,以便在释放内存后函数也可以取消设置:
static void _FreeBuf( const uchar16_t ** pBufPtr );
void Ucs2String::_FreeBuf( const uchar16_t ** pBufPtr );
{
assert( NULL != pBufPtr && NULL != *pBufPtr );
delete[] *pBufPtr;
*pBufPtr = NULL;
}
但使用时如下:
_FreeBuf( & m_wsBuf );
m_wsBuf
是会员的地方:uchar16_t * m_wsBuf;
它会产生错误:
Error 1 error C2664: 'core::Ucs2String::_FreeBuf' : cannot convert parameter 1 from 'uchar16_t **__w64 ' to 'const uchar16_t **'
删除const修复了问题,但我不明白为什么。 该函数正在修改地址传递的指针,而不是指向的const uchar16_t数组,为什么我需要删除这个const?
PS:我正在使用VS2005(而且没有C ++ 11)
答案 0 :(得分:2)
此处的问题是,当您调用_FreeBuf( & m_wsBuf );
函数时:您尝试将X**
转换为const X**
(此处X为uchar16_t
,但错误会有无论什么类型都会发生。)
当隐式执行此类转换时(即没有const_cast
),这在C ++中是禁止的。
您可以通过删除const
或将参数类型更改为const uchar16_t * const*
来解决此问题(在这种情况下,这不会起作用,因为您无法将指针设置为NULL功能)。
有关C ++以这种方式工作的原因的详细信息,请参阅this link。