编译C++项目时出现以下错误。
Error C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)': cannot convert argument 4 from 'std::unique_ptr>' to 'LPWSTR'
在下面的代码行中:
CryptBinaryToString(reinterpret_cast<const BYTE*>(strData.c_str()), dwSize,
dwOptions, pwszBuffer, &dwLength);
而且我也收到以下错误:
Error C2679 binary '=': no operator found which takes a right-hand operand of type 'std::unique_ptr>' (or there is no acceptable conversion)
在下面的行:
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;
}
谁能帮我解决这些错误?
最佳答案
您正在将 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
,而不应将其从func
中使用。related
关于c++ - 错误C2664 'BOOL CryptBinaryToStringW(const BYTE *,DWORD,DWORD,LPWSTR,DWORD *)' : cannot convert argument 4 from 'std::unique_ptr' to 'LPWSTR' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032220/