有个函数的参数是父类指针的引用, 现在传入一个子类的指针,报错,提示不用用rvalue作为参数,

shengdewu 2018-01-15 10:57:21
有个函数的参数是父类指针的引用,
现在传入一个子类的指针,报错,提示不用用rvalue作为参数,
自己查了很多资料,没有找到原因,希望各位大神,指点指点。

//编译环境 ubuntu16 g++5.4.0
//各种构造函数,析构函数 虚析构函数均有
class FrameData
{
public:
virtual FrameData* clone() = 0;
};

class CommonFrameData : public FrameData
{
public:
FrameData* clone();
};

class F{
void get(FrameData *&frameData){}
}


void main()
{
F f;
//1.这种情况正确
FrameData *framePtr = new CommonFrameData
f.get(framePtr);

//2.这种情况报错
///error: invalid initialization of non-const reference of type ‘FrameData*&’ from an rvalue of type ‘FrameData*’
CommonFrameData *framePtr = new CommonFrameData;
f.get(framePtr);
}
...全文
588 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2018-01-15
  • 打赏
  • 举报
回复
因为非常量引用不能绑定右值,方法一就是不按引用传递,方法二是先定义一个父类的指针并赋值为该子类指针,然后再传入该父类指针
真相重于对错 2018-01-15
  • 打赏
  • 举报
回复
void get(FrameData *&frameData){} --> void get(FrameData *frameData){}
Saleayas 2018-01-15
  • 打赏
  • 举报
回复
这和传出指针是一个意思,当是传入的时候,你可以传进来一个继承类。此时是向下转换。 当时,当传出的时候,你不能假定的。此时需要向上转换的,编译器是不允许的。 T ** 和 T *& 是一个意思,在 C++ 里面,引用参数就是一个非空的指针。 而 T * 就是可以的,因为他仅仅是传入的。
真相重于对错 2018-01-15
  • 打赏
  • 举报
回复
*& 和 *并不是一个东西
shengdewu 2018-01-15
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错的回复:
void get(FrameData *&frameData){} --> void get(FrameData *frameData){}
其实有其他方式,比如像你这种,只是当时无意中用了指针引用,发现的问题,比较好奇。
shengdewu 2018-01-15
  • 打赏
  • 举报
回复
引用 2 楼 paschen的回复:
因为非常量引用不能绑定右值,方法一就是不按引用传递,方法二是先定义一个父类的指针并赋值为该子类指针,然后再传入该父类指针
看了推荐的博客,思路清晰了一点

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧