尝试将套接字存入结构时出现问题

Issue when trying to stock a socket into a structure

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

    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";
}

会话如下所示:

class chat_session : public chat_participant,
    public std::enable_shared_from_this<chat_session>
{
  public:
       
    chat_session::chat_session(tcp::socket socket, chat_room& room,
      std::map<chat_participant_ptr, participants_name> 
      &participants_):
      socket_(std::move(socket)), room_(room), 
      participants(participants_)
    {
      commands["LOGIN"] = &chat_session::login;
      commands["ADDCONTACT"] = &chat_session::add_friend;
    }

    void start();
    void chat_session::add_participants(chat_participant_ptr chat_participant)


    [...... A few methods here ..... ]


    typedef void (chat_session::*cmdfunctions)(std::string, chat_participant_ptr);
    typedef std::map<std::string, cmdfunctions> functions_map;

    functions_map commands;
    tcp::socket socket_;
    chat_room room_;
    std::map<chat_participant_ptr, participants_name> &participants;
    chat_message read_msg_;
    chat_message_queue write_msgs_;
};

class chat_server
{
public:
  chat_server(boost::asio::io_service& io_service,
      const tcp::endpoint& endpoint)
    : acceptor_(io_service, endpoint),
      socket_(io_service) { do_accept(); }

private:
  void do_accept();
  tcp::acceptor acceptor_;
  tcp::socket socket_;
  chat_room room_;
  std::map<chat_participant_ptr, participants_name> participants;

};

这是编译器抱怨的内容: [...] /usr/include/c++/10.2.0/tuple:1689:70: 错误:没有匹配函数来调用‘participants_name::participants_name()’ 第 1689 章第二(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)

我已经尝试了很多方法,但没有任何效果,任何帮助将不胜感激!

这里出现错误

  this->participants[chat_participant] = participants_name(std::move(socket_));

不是因为赋值右边的participants_name对象构造不出来,而是因为映射中的新条目

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

无法创建,因为 struct participants_name 没有默认构造函数(没有参数)。

那是因为按照它的书写方式,map[key] = value,地图必须

  • 先输入一对新的(key, default value)
  • return 对新创建的默认值的引用
  • 为其分配新值。

可以通过构造新的映射条目in-place来避免错误,方法是:

  this->participants.emplace(chat_participant, participants_name(std::move(socket_)));