我正在尝试将套接字存储到结构中。我以为这很简单,但是套接字没有构造函数(据我了解)的事实使这件事对我来说非常棘手。 这是我尝试过的:
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))...)
我尝试了很多事情,但是没有用,任何帮助将不胜感激!
答案 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)