【问题标题】:C++17 map emplace without default constructor (private default constructor) [duplicate]没有默认构造函数(私有默认构造函数)的C ++ 17 map emplace [重复]
【发布时间】:2020-05-19 09:18:49
【问题描述】:

我喜欢使用私有默认构造函数将对象放置到地图中。所以发现下面的代码不起作用:

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

在 C++ 中有没有办法使用私有默认构造函数来做到这一点?

【问题讨论】:

  • 您收到的错误信息是什么?

标签: c++ c++17 stdmap


【解决方案1】:

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

   return database_instances[session_name];

而不是打电话给emplace?

该行将尝试在映射中不存在键的情况下默认构造一个值DB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2016-07-18
    • 1970-01-01
    • 2021-09-02
    • 2018-03-09
    • 2015-07-24
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多