Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::string参数和不可移动/可复制参数构建std::map_C++_C++11_Stl - Fatal编程技术网

C++ 使用std::string参数和不可移动/可复制参数构建std::map

C++ 使用std::string参数和不可移动/可复制参数构建std::map,c++,c++11,stl,C++,C++11,Stl,我试图构建一个简单的日志系统,但我的概念遇到了一个问题: class logger_instance { std::string log_file; std::string log_type; std::ofstream log; public: logger_instance(std::string log_type) : log_type(log_type), log_file("logs\\" + log_type + ".log"), log(log_f

我试图构建一个简单的日志系统,但我的概念遇到了一个问题:

class logger_instance
{
    std::string log_file;
    std::string log_type;
    std::ofstream log;

public:
    logger_instance(std::string log_type) : log_type(log_type), log_file("logs\\" + log_type + ".log"), log(log_file)
    {
        operator << ("logger_instance(" + log_type + ") init.\n");
    }

    std::string get_log_type() const
    {
        return log_type;
    }

    std::string get_log_file() const
    {
        return log_file;
    }


    logger_instance& operator << (std::string message)
    {
        time_t current_time;
        time(&current_time);

        log << ctime(&current_time);
        log << " : ";
        log << message;
        log << "\n";
    }
};

class logger_manager
{
    std::map < std::string, logger_instance > loggers;

public:
    void add_logger(std::string logger)
    {
        auto it = loggers.find(logger);

        if (it == loggers.end())
        {
            loggers.emplace(logger, logger);
        }
    }

    logger_instance& operator[](std::string logger)
    {
        return loggers[logger];
    }
};
类记录器\u实例
{
字符串日志文件;
std::字符串日志类型;
std::流测井;
公众:
logger_实例(std::string log_类型):log_类型(log_类型)、log_文件(“logs\\”+log_类型+”.log)、log(log_文件)
{

操作员在地图上安置是一件相当奇怪的事情。我会推荐斯科特·迈耶的最新著作,或者看看。它是关于cwuks(斯科特的术语)

但要解决问题,请使用堆。 通过将logger_实例更改为manager中唯一的_ptr。 例如:

类记录器\u管理器
{
std::map记录器;
公众:
void add_记录器(std::string记录器)
{
自动it=记录器。查找(记录器);
if(it==loggers.end())
{
安置(记录器,使_独一无二(记录器));
}
}
记录器\实例和运算符[](标准::字符串记录器)
{
返回*记录器[记录器];
}
};

Unrelated:您在
logger\u instance::operator中忘记了
return*这个
,您正在使用
logger
作为
emplace
的两个参数,但第二个应该是
logger\u instance
,而不是
std::string
class logger_manager
{
    std::map < std::string, unique_ptr<logger_instance> > loggers;
public:
    void add_logger(std::string logger)
    {
        auto it = loggers.find(logger);
        if (it == loggers.end())
        {
            loggers.emplace(logger, make_unique<logger_instance>(logger));
        }
    }

    logger_instance& operator[](std::string logger)
    {
        return *loggers[logger];
    }
};