std::unique_ptr使用箭头报错?

qq_40162781 2020-09-11 10:14:35
template<typename T_>
using Type = int(XXX::*)(int, const T_&);


template<typename T_>
int FUN(int, Type<T_> call)
{
//stub_: std::unique_ptr<xxx> stub_;
((*stub_).*call)(1, a);
//(stub_->*call)(1, a);
}


我使用模板进行了类似的操作,但是使用*号解引用可以成功调用,而使用箭头却报错?
...全文
136 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2020-09-11
  • 打赏
  • 举报
回复
你的代码没有贴全
qybao 2020-09-11
  • 打赏
  • 举报
回复
可以参考以下帖子的3L的回答 https://bbs.csdn.net/topics/397616827
真相重于对错 2020-09-11
  • 打赏
  • 举报
回复
引用 11 楼 qq_40162781的回复:
引用 9 楼 真相重于对错 的回复:
引用 8 楼 qq_40162781 的回复:
[quote=引用 6 楼 真相重于对错 的回复:]
明白了,你说的意思是没有重载->*,我理解成了-> 编译器遇到这句是解释成->* 又没办法使用括号分开来。所以智能指针除了返回原始指针以外无解了。
我打字马虎了
qybao 2020-09-11
  • 打赏
  • 举报
回复
他的情况和你的差不多,你的call是A的成员函数,所以调用call需要一个A对象或指针(成员函数默认参数多一个A类型的this指针),而*stub_解引用的到的就是A对象,所以没问题;而stub_本身是个智能指针,不是A类型的指针,虽然智能指针重载了->,但是不支持->*操作,所以访问不了。 类似问题可参考 https://www.coder.work/article/1207632
qq_40162781 2020-09-11
  • 打赏
  • 举报
回复
引用 9 楼 真相重于对错 的回复:
引用 8 楼 qq_40162781 的回复:
[quote=引用 6 楼 真相重于对错 的回复:]
明白了,你说的意思是没有重载->*,我理解成了-> 编译器遇到这句是解释成->* 又没办法使用括号分开来。所以智能指针除了返回原始指针以外无解了。
真相重于对错 2020-09-11
  • 打赏
  • 举报
回复
引用 8 楼 qq_40162781 的回复:
引用 6 楼 真相重于对错 的回复:
智能指针肯定有重载->,使用它的行为应该跟使用普通指针的行为一直才符合常理呀
事情不是你认为合理才是合理,它本来就没有,它只有operator* operator-> .* 不能重载, ->stl 类都没有重载。 标准库中的类都没有重载 operator->*。曾有建议将其作为智能指针接口的一部分,并在 boost.phoenix 中的 actor 上有实际应用,但它在如 cpp.react 这样的 EDSL 中更为常见。
qq_40162781 2020-09-11
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
智能指针肯定有重载->,使用它的行为应该跟使用普通指针的行为一直才符合常理呀
真相重于对错 2020-09-11
  • 打赏
  • 举报
回复
你要用->* stub_.get()->*call
真相重于对错 2020-09-11
  • 打赏
  • 举报
回复
stub_是智能指针 ,->* .* 是一个操作符而不是两个 .* 表示左操作数是一个值类型, ->表示左操作数是一个指针类型 它的右操作数是偏移量。左操作数是具体对象, 通过这两个操作符调用成员函数.左操作数就是相当于平时没有写的this指针 你通过.*调用是因为 前面的(*stub),他返回了那个智能指针包裹的对象 而通过->.调用你是直接用的智能指针,智能指针可没有重载->.
qq_40162781 2020-09-11
  • 打赏
  • 举报
回复
并且使用普通指针不会出现这问题,这是不是unique_ptr的bug?还是说我使用有问题
qq_40162781 2020-09-11
  • 打赏
  • 举报
回复
引用 2 楼 yshuise 的回复:
你的代码没有贴全
#include <iostream>
#include <memory>
struct A
{
	void fun(int a, int b) { std::cout << a << " " << b << std::endl; }
};

struct B
{
	B() :stub_(new A) {}
	void fun(int, void(A::*call)(int,int)) {
		int a = 3;
		((*stub_).*call)(1, a);
		//(stub_->*call)(1, a);
	}
private:
	std::unique_ptr<A> stub_;
};

int main()
{
	B b;
	b.fun(3, &A::fun);
	std::cin.get();
	return 0;
}
qq_40162781 2020-09-11
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
可以参考以下帖子的3L的回答 https://bbs.csdn.net/topics/397616827
看了,我的跟他的不一样。他是类成员指向类的函数。 我的call就是stub_的成员函数,已经使用stub_但是使用箭头还是无法调用成功。

64,683

社区成员

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

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