函数重载 与 const 错误问题(MTK36_11A平台)

来源:互联网 发布:淘宝怎么发买家秀 编辑:程序博客网 时间:2024/05/16 07:19
问题1: 重载函数不能通过函数的参数类型来判断,只能通过函数的参数个数来判断使用哪一个函数

如果有下列两个函数,调用时编译器是不能区分的,会报错。
VappVideoPlayerPage::VappVideoPlayerPage(VfxWString &file_path,VfxBool fromFileMgr):
VappVideoPlayerPage::VappVideoPlayerPage(const VfxWString &file_path,VfxS32 cur_idx):

问题2: 不能把 const 的变量传给非 const 的参数,但是非 const 变量可以传递给 const 参数

错误提示:"venusmmi/app/Cosmos/VdoPly/vapp_vdoply.cpp", line 3027: Error:  #289: no instance of constructor "VappVideoPlayerPage::VappVideoPlayerPage" matches the argument list
            argument types are: (VfxWString, const VfxS32)
              VFX_OBJ_CREATE_EX(playerPage, VappVideoPlayerPage, scr, (VFX_WSTR_MEM(path),sortMethod));

line 3027代码为:    VFX_OBJ_CREATE_EX(playerPage, VappVideoPlayerPage, scr, (VFX_WSTR_MEM(path),sortMethod));

后面检查发现:const VfxS32 sortMethod = pOption->sortMethod;

而 带参的构造函数声明为:
//从文件管理进入播放器会用到这个带参的构造函数
VappVideoPlayerPage::VappVideoPlayerPage(VfxWString &file_path,VfxS32 sortMethod):

问题原因:就是将一个const的变量传递给了一个非const的参数

修改方法1:将函数的定义和声明里面把第二个参数都加上const,即变为 VappVideoPlayerPage::VappVideoPlayerPage(VfxWString &file_path,const VfxS32 sortMethod):
修改方法2:将局部变量定义为非const 类型,即 const VfxS32 sortMethod = pOption->sortMethod; 变为 VfxS32 sortMethod = pOption->sortMethod;

修改之后,remake cosmos_app ,还是编译不过,继续提示,参数列表类型不匹配。纳闷……
续:

错误提示:"venusmmi/app/Cosmos/VdoPly/vapp_vdoply.cpp", line 3027: Error:  #289: no instance of constructor "VappVideoPlayerPage::VappVideoPlayerPage" matches the argument list
            argument types are: (VfxWString, VfxS32)
              VFX_OBJ_CREATE_EX(playerPage, VappVideoPlayerPage, scr, (VFX_WSTR_MEM(path),sortMethod));

这一次的错误提示中并没有提示是哪一个参数不匹配。一直以为是编译问题,没有怀疑代码,就开始使劲编译,把cosmos_app下面所有obj删除,重新remake了好几次,问题依旧。

修改代码: playerPage = new VappVideoPlayerPage(VFX_WSTR_MEM(path),sortMethod);

错误提示第一个参数类型不匹配。

再仔细检查,也发现第一个参数可疑,下面是第一个参数的定义:
const VappGalleryLaunchOption *pOption = reinterpret_cast<VappGalleryLaunchOption *>(args);
const VfxWChar* path = pOption->filePath;

很明显第一个参数也是const 类型的。但是在代码中是如下使用的。
VFX_OBJ_CREATE_EX(playerPage, VappVideoPlayerPage, scr, (VFX_WSTR_MEM(path),sortMethod));

就是经过 VFX_WSTR_MEM 转换了一下,将一个字符串指针转换为一个VfxWString 类型对象。

但是为什么第一个类型不匹配不报错误呢?
原因是
VFX_WSTR_MEM这个宏产生了一个临时对象,而临时对象只能传递给对应类型的常引用,所以二个参数的构造第一个参数要是const的引用。

也就是说,只要是 (VFX_WSTR_MEM(path)) 这样给构造函数传参的话就需要 将对应的参数类型定义为const 类型。

至此问题解决……

下面来看另外一个例子:


这个地方定义了一个非 const 的变量

VfxWString path;

m_mediaList->getMediaPath(index, path);


将其传递给一个 const 类型的参数

VFX_OBJ_CREATE_EX(playerPage, VappVideoPlayerPage, getMainScr(), (VFX_WSTR_MEM(path),cur_idx,FS_SORT_NAME));

没有问题。

是因为 VappVideoPlayerPage::VappVideoPlayerPage(const VfxWString &file_path,VfxS32 cur_idx, VfxS32 sortMethod): 该构造函数第一个参数定义为 const 类型。 如果将此构造函数第一个参数定义为非 const 类型,则会报错,说类型不匹配。


问题2总结:只要是 (VFX_WSTR_MEM(path)) 这样给构造函数传参的话就需要 将对应的参数类型定义为const 类型


原创粉丝点击