编译AWS-SDK-CPP的S3上传示例代码时遇类型转换编译错误
AWS C++ SDK S3 PutObject编译错误修复
问题重现
编译S3上传文件代码时出现以下错误:
In function ‘aws::lambda_runtime::invocation_response putFileObject(Aws::S3::S3Client&, const String&, const String&)’:
error: cannot convert ‘std::shared_ptrstd::basic_fstream’ to ‘const std::shared_ptrstd::basic_iostream &’
错误原因
PutObjectRequest::SetBody要求传入std::shared_ptr<Aws::IOStream>类型的参数,而你使用Aws::MakeShared<Aws::FStream>创建的是std::shared_ptr<Aws::FStream>。虽然FStream继承自IOStream,但C++智能指针的协变转换无法自动完成,必须显式处理。
解决方案
方案1:显式转换智能指针类型
在调用SetBody时,用std::static_pointer_cast将FStream的智能指针转换为IOStream类型:
request.SetBody(std::static_pointer_cast<Aws::IOStream>(inputData));
方案2:直接创建IOStream类型的智能指针
将MakeShared的模板参数改为Aws::IOStream,直接生成符合要求的智能指针:
auto inputData = Aws::MakeShared<Aws::IOStream>("SampleAllocationTag", fileName.c_str(), std::ios_base::in | std::ios_base::binary);
方案3:使用SDK专用的文件读取流(推荐)
AWS SDK提供了Aws::FileReadStream类,专门用于读取文件,它直接继承自IOStream,可以直接传递给SetBody,代码更简洁:
auto inputData = Aws::MakeShared<Aws::FileReadStream>("SampleAllocationTag", fileName.c_str());
修改后的完整代码
以方案3为例,修改后的代码如下:
invocation_response putFileObject(Aws::S3::S3Client &client, const Aws::String& bucketName, const Aws::String& objectName) { const std::string fileName = "/tmp/test"; auto inputData = Aws::MakeShared<Aws::FileReadStream>("SampleAllocationTag", fileName.c_str()); Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucketName); request.SetKey(objectName); request.SetBody(inputData); Aws::S3::Model::PutObjectOutcome outcome = client.PutObject(request); if (!outcome.IsSuccess()) { std::cout << "Failure Putting Object" << std::endl; return aws::lambda_runtime::invocation_response::failure("Error Putobject", "application/json"); } else { std::cout << "Success Putting Object" << std::endl; return aws::lambda_runtime::invocation_response::success("Success Putobject", "application/json"); } }
内容的提问来源于stack exchange,提问作者Karan Parikh
相关产品推荐
相关产品推荐

