我正在使用 Andoird 4.4 kk 在 MTK 平台上工作。
搭建环境检查结果报告
[操作系统]:Ubuntu 10.04.4(64 位)[确定]
[物理内存大小]:8079280 K 字节[确定]
[制作]:3.81(64 位)[确定]
[perl]:5.10.1(64 位)[确定]
[python]:2.6.5(64 位)[确定]
[arm-linux-androideabi-gcc]:4.7(64 位)[确定]
[gcc]:4.4.3(64 位)[确定]
[jdk]: 1.6.0_33 (64-bit) [确定]
[野牛]:2.4.1(64 位)[确定]
[弹性]:2.5.35(64 位)[确定]
[gperf]:3.0.3(64 位)[确定]
[mingw]:已安装[确定]
[unix2dos/tofrodos]:已安装 [确定]
- 代码
(1) 记录客户端.BufOps.cpp:
...
RecBufManager mpImgBufMgr;
mpImgBufMgr.init();
...
// Here is what I want to do
sp<ICameraImgBuf> pImgBuf = mpImgBufMgr->getBuf(1);
sp<RecImgBuf> pRecImgBuf = dynamic_cast<sp<RecImgBuf> >(pImgBuf);
(2)
class RecImgBuf : public ICameraImgBuf {
public:
virtual ~RecImgBuf();
}
(3)
class RecBufManager : public RefBase
{
public:
sp<ICameraImgBuf>const& getBuf(size_t index) const { return mvImgBuf[index]; }
private:
Vector< sp<ICameraImgBuf> > mvImgBuf;
}
(4)
bool
RecBufManager::
init(){
...
RecImgBuf* pRecImgBuf = RecImgBuf::alloc(...);
mvImgBuf.push_back(pRecImgBuf);
...
}
(5)
class ICameraImgBuf : public IImgBuf, public ICameraBuf
{
};
然后我得到了错误: mediatek/platform/mt6592/hardware/mtkcam/v1/hal/client/CamClient/Record/RecordClient.BufOps.cpp: 在成员函数'bool android::NSCamClient::NSRecordClient::RecordClient::handleReturnBuffers(const android::Vector& )': mediatek/platform/mt6592/hardware/mtkcam/v1/hal/client/CamClient/Record/RecordClient.BufOps.cpp:325:68: error: cannot dynamic_cast 'pImgBuf' (of type 'class android::sp' ) 键入“class android::sp”(目标不是指针或引用)
当我删除以下代码时:
sp<RecImgBuf> pRecImgBuf = dynamic_cast<sp<RecImgBuf> >(pImgBuf);
它工作正常。
如何修复错误?谢谢。
更新:
我简单的认为android的sp等于指针。所以我更改了代码:
sp<RecImgBuf>& pRecImgBuf = dynamic_cast<sp<RecImgBuf>& >(pImgBuf);
新错误:
错误:无法 dynamic_cast 'pImgBuf'(类型为 'class android::sp')以键入 'class android::sp&'(源类型不是多态的)
即使我将虚拟方法添加到源类型 ICameraImgBuf 中,如下所示:
class ICameraImgBuf : public IImgBuf, public ICameraBuf
{
public:
virtual ~ICameraImgBuf(){}
};
最佳答案
dynamic_cast 仅适用于指针或引用
关于android - 如何在 Android 中使用 dynamic_cast 修复编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22625756/