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

时间:2020-10-12 14:43:00

标签: c++ sockets boost-asio

我正在尝试将套接字存储到结构中。我以为这很简单,但是套接字没有构造函数(据我了解)的事实使这件事对我来说非常棘手。 这是我尝试过的:

    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))...)

我尝试了很多事情,但是没有用,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

错误在这里引起

Prelude> parseChar 'a' "abcd"
Just ('a',"bcd")
Prelude> parseChar 'z' "abcd"
Nothing
Prelude> parseChar 'a' ""
Nothing

不是因为无法构造分配右侧的 this->participants[chat_participant] = participants_name(std::move(socket_)); 对象,而是因为地图中的新条目

participants_name

无法创建,因为结构std::map<chat_participant_ptr, participants_name> &participants; 没有默认的构造函数(不带参数)。

这是因为在编写participants_name时,地图必须

  • 首先输入一对新的map[key] = value
  • 返回对新创建的默认值的引用
  • 为其分配新值。

您可以通过以下方式就地构建新的地图条目来避免错误:

(key, default value)