C++ C++;17无默认构造函数的地图放置(专用默认构造函数)

C++ C++;17无默认构造函数的地图放置(专用默认构造函数),c++,c++17,stdmap,C++,C++17,Stdmap,我喜欢将对象放置到带有私有默认构造函数的映射中。因此,请找出以下代码不起作用: class DB { public: DB(std::string user, std::string password, std::string db, std::string host, unsigned int port = 3306); static DB& instance( std::string const& session_n

我喜欢将对象放置到带有私有默认构造函数的映射中。因此,请找出以下代码不起作用:

class DB {
public:
    DB(std::string user, std::string password,
        std::string db, std::string host, unsigned int port = 3306);

    static DB& instance(
             std::string const& session_name,
             std::string const& user = "user",
             std::string const& password = "password",
             std::string const& db = "database",
             std::string const& host = "localhost",
             unsigned int port = 3306) {
         auto instance = database_instances.find(session_name);

         if (instance == database_instances.end()) {
             //database_instances.emplace(session_name, user, password, db, host, port);
             //database_instances.insert( std::unordered_map< std::string, DB >::value_type ( session_name, DB{user, password, db, host, port}));
             database_instances.emplace(std::piecewise_construct,
                                  std::forward_as_tuple(session_name),
                                  std::forward_as_tuple(user, password, db, host, port));
         }
        return database_instances[session_name];
    }

    static std::shared_ptr<DB> instance(
            std::string const& session_name);

    static DB& instance();

    ~DB() = default;

private:
    DB() = default;

    DB(const DB& );

    DB & operator = (const DB &);

    /** fields: user, password ... **/

    static std::map<std::string, DB> database_instances;
};
classdb{
公众:
DB(标准::字符串用户,标准::字符串密码,
std::string数据库,std::string主机,无符号int端口=3306);
静态数据库&实例(
std::字符串常量和会话名称,
std::string const&user=“user”,
std::string const&password=“password”,
std::string const&db=“数据库”,
std::string const&host=“localhost”,
无符号整数端口=3306){
自动实例=数据库\实例.find(会话\名称);
if(instance==数据库_instances.end()){
//数据库实例。安放(会话名称、用户、密码、数据库、主机、端口);
//数据库实例.insert(std::无序映射::值类型(会话名称,DB{user,password,DB,host,port}));
数据库_实例.emplace(std::分段_构造,
std::转发作为元组(会话名称),
std::转发作为元组(用户、密码、数据库、主机、端口));
}
返回数据库_实例[会话_名称];
}
静态std::共享的ptr实例(
std::字符串常量和会话名称);
静态数据库&实例();
~DB()=默认值;
私人:
DB()=默认值;
DB(const DB&);
DB&运算符=(const DB&);
/**字段:用户、密码**/
静态std::map数据库_实例;
};

C++中有没有一种方法可以使用私有默认构造函数来实现?

你确定给出错误的行不是这个:

   return database_instances[session_name];
而不是调用
emplace


如果映射中不存在键,该行将尝试默认构造一个值
DB

是否确定给出错误的行不是这一行:

   return database_instances[session_name];
而不是调用
emplace


如果映射中不存在键,该行将尝试默认构造一个值
DB

您得到的错误消息是什么?您得到的错误消息是什么?