尝试将套接字存入结构时出现问题
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_)));
我正在尝试将套接字存储到结构中。我认为这将是直截了当的,但事实上套接字没有构造函数(据我所知)使这件事对我来说非常棘手。 这是我尝试过的:
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_)));