补充一下,我想基于 libevent 实现一个 tcp 服务器,其中 server_socket 负责建立连接,server_connect 将客户端连接封装为一个类用于处理读写请求,但我需要在 server_connect 类中保存 server_socket 的引用。
该类的声明:
class server_connect final {
public:
explicit server_connect(server_socket &, int, event_base *);
...
private:
server_socket &server_sock;
...
};
在另一个函数中将 server_connect 对象保存于 map 中
typedef std::pair<int, server_connect> connect_pair;
// 接收请求事件回调
void tcp_accept_handler(int socket_fd, short events, void *arg) {
auto server_sk_ptr = (server_socket*) arg;
...
// 此处代码调用 server_connect 构造函数时提示找不到对应的构造函数
server_sk_ptr->connect_map.insert(connect_pair(client_sock_fd, server_connect(*server_sk_ptr, client_sock_fd, server_sk_ptr->ev_base)));
}
第一次遇到这样的问题,用的 ide 也显示参数列表匹配 (CLion 参数匹配上了会高亮显示)
求助
这不是单纯的参数不匹配,而是:你在
insert
的时候,实际上是以拷贝方式传参,而server_connect
可拷贝吗?或者进一步:这个类型,它在概念上,其内容就能够被复制吗?
鉴于它很可能持有了系统资源(网络handle什么的),并且分明有个引用成员呆在那,我觉得它八成是不可拷贝的。
你应当使用
emplace
,或者在map里用智能指针。