Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试将套接字存储到结构中时出现问题_C++_Sockets_Boost Asio - Fatal编程技术网

C++ 尝试将套接字存储到结构中时出现问题

C++ 尝试将套接字存储到结构中时出现问题,c++,sockets,boost-asio,C++,Sockets,Boost Asio,我正在尝试将套接字存储到结构中。我认为这将是直截了当的,但事实上,套接字没有构造函数(据我所知),这对我来说非常棘手。 以下是我尝试过的: struct participants_name { participants_name(tcp::socket); chat_participant_ptr _participant; std::string name; std::string password; bool logged_

我正在尝试将套接字存储到结构中。我认为这将是直截了当的,但事实上,套接字没有构造函数(据我所知),这对我来说非常棘手。 以下是我尝试过的:

    struct participants_name {
      participants_name(tcp::socket);
      chat_participant_ptr _participant;
      std::string name;
      std::string password;
      bool logged_in;
      tcp::socket socket_;
      std::map<std::string, contacts_> contacts;
    };


participants_name::participants_name(tcp::socket socket): socket_(std::move(socket))
{

}

void chat_session::add_participants(chat_participant_ptr chat_participant)
{
  this->participants[chat_participant] = participants_name(std::move(socket_));
  this->participants[chat_participant]._participant = chat_participant;
  this->participants[chat_participant].logged_in = false;

  std::cout << "Participant "<< chat_participant << " has connected\n";
}
struct参与者\u名称{
参与者名称(tcp::socket);
聊天参与者ptr参与者;
std::字符串名;
std::字符串密码;
bool登录;
tcp::socket-socket;
地图联系人;
};
参与者名称::参与者名称(tcp::socket socket):socket(std::move(socket))
{
}
void chat\u会话::添加参与者(chat\u参与者\u ptr chat\u参与者)
{
这->参与者[聊天参与者]=参与者名称(std::move(socket));
此->参与者[聊天参与者]。\u参与者=聊天参与者;
此->参与者[聊天参与者].logged\u in=false;

std::cout错误是由这里引起的

  this->participants[chat_participant] = participants_name(std::move(socket_));
不是因为无法构造作业右侧的
参与者\u name
对象,而是因为映射中的新条目

std::map<chat_participant_ptr, participants_name> &participants;

如果您想通过
操作符[]
将新元素插入映射,则
类型必须是默认可构造的,这不是您的情况。
参与者的名称
没有默认构造函数。请尝试
映射::emplate
将新项目放入映射,而不是
操作符[]
。谢谢你的回答,答案很清楚,我想我明白了你的意思……但是当我尝试你的建议时,同样的错误发生了……编译器抱怨“没有匹配的函数”,然后警告说“候选者需要1个参数,提供0”…更新:我试图声明一个变量participants\u name,但没有将其映射到任何映射,如:“participants\u name elem(std::move socket);exit(0)”同样的错误发生我很抱歉没有解决。我怀疑你的代码和我的代码之间还有一些差异。我无法按原样使用你的代码来测试我的答案;它不是自包含的;因此我不得不从你的结构参与者名称中删除一些字段。我恐怕我无法进一步远程调试你的问题。请e在联机编译器中查找我的解决方案(包括您的第二条评论)后,重新表述您的问题。它编译时没有错误。谢谢,我终于解决了问题。您所说的确实正确,但每当我尝试通过“参与者[chat\u参与者]。value\u to\u change”访问数据时,再次向我抛出相同的错误,因此我只创建了一个迭代器并使用find方法来更改值!再次感谢您的时间和好意:)
std::map<chat_participant_ptr, participants_name> &participants;
  this->participants.emplace(chat_participant, participants_name(std::move(socket_)));