编译C ++项目时出现以下错误。
错误C2664'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)':无法将参数4从'std :: unique_ptr>'转换为'LPWSTR'
在下面的代码行中:
CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
dwOptions, pwszBuffer, &dwLength);
我也收到以下错误:
错误C2679二进制'=':未找到采用'std :: unique_ptr>'类型的右侧操作数的运算符(或没有可接受的转换)
在下面的行:
sBase64 = pwszBuffer;
以下是完整的代码:
bool EMRReader::EncodeBase64(DWORD dwSize, const std::string& strData, wstring& sBase64)
{
DWORD dwOptions = CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF;
DWORD dwLength = 0;
BOOL bRet = CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
dwOptions, 0, &dwLength);
if (!bRet)
return bRet;
std::unique_ptr<std::wstring> pwszBuffer = std::make_unique<std::wstring>(dwLength + 1);
if (!pwszBuffer)
return FALSE;
SecureZeroMemory(pwszBuffer.get(), (dwLength + 1) * sizeof(wchar_t));
CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
dwOptions, pwszBuffer, &dwLength);
sBase64 = pwszBuffer;
return TRUE;
}
有人可以帮我解决这些错误吗?
答案 0 :(得分:0)
您正在将std::unique_ptr
<wstring>
对象分配给wstring
类型的变量。如果要将pwszBuffer
的值分配给类型为wstring
的变量,则应获取unique_ptr
的值,然后将其分配给该变量。
您可以通过调用std::unique_ptr
运算符来获取*
的值:
sBase64 = *pwszBuffer;
编辑:如果要将std::unique_ptr
传递给函数,则有两种方法:
void func(std::unique_ptr<std::wstring>& input_ptr) {
// Do something...
}
然后简单地使用它:
std::unique_ptr<std::wstring> function_input;
func(function_input);
或者2.如果要按值传递它,请移动它:
void func(std::unique_ptr<std::wstring>&
input_ptr) {
// Do something...
}
,然后用std::move
传递:
std::unique_ptr<std::wstring> function_input;
func(std::move(function_input));
您应该注意,在这种情况下,移动function_input
后,它一无所有并持有nullptr
,并且您不应使用将其从{{ 1}}。