没有用于初始化的匹配构造函数

 小宋提刑官_783 发布于 2023-02-09 13:05

我在StackOverflow上看过类似的问题,但似乎没有一个适用于我.

这是我的代码:


Option.cpp

#include "Option.h"

Option::Option(string valueName, string description, OptionType type){
    this->valueName = valueName;
    this->description = description;
    this->type = type;
};


Option.h

#include 
using namespace std;

enum OptionType { FLAG, REQUIRED, NORMAL };
class Option {
    string valueName, description, value;
    OptionType type;
public:
    Option(string valueName, string description, OptionType type);
    void setValue(string value) {
        this->value = value;
    };
    string getValueName() {
        return this->valueName;
    };
    string getDescription() {
        return this->description;
    };
    OptionType getType() {
        return this->type;
    };
};


Options.cpp

#include "Options.h"
using namespace std;

Options::Options(int _argc, const char * _argv[]) : argv(_argv) {
    this->argc = _argc;
}

Options::~Options() {
    options.~unordered_map();
}

void Options::printHelp() {
    for (auto &i : options) {
        cout << i.first << '\t' << i.second.getDescription() << '\n';
    }
}

void Options::addFlag(string flagName, string description) {

}

void Options::addOption(string optionName, string valueName, string description, OptionType type) {
    Option option(valueName, description, type);
    options[optionName]=option;
}

void Options::addOptionAlias(string aliasName, string optionName) {

}


Options.h

#include 
#include 
#include "Option.h"

using namespace std;

class Options {
    unordered_map options;
    int argc;
    const char ** argv;

public:
    Options(int argc, const char * argv[]);
    ~Options();
    void parse();
    void addOption(string optionName, string valueName, string description, OptionType type);
    void addFlag(string flagName, string description);
    void addOptionAlias(string aliasName, string optionName);
    void getOption(string optionName);
    void printHelp();


};

这是Option option(valueName, description, type);错误似乎源于的行中的options.cpp ,但对于我的生活,我无法弄清楚为什么.据我所知,Option中的构造函数采用了正确的类型.

1 个回答
  • 问题实际上在下一行:

    options[optionName]=option;
    

    首先operator[]在地图中调用,搜索给定的键并返回相关的值.如果未找到密钥,则会插入连接到该密钥的默认初始化值.然后,此值是使用您的选项分配的副本.

    你看到了问题吗?您的Option类没有默认构造函数,因此无法进行默认初始化!仔细阅读您的错误消息,肯定是在讨论默认构造函数,而不是您正在查看的构造函数.

    你有几个解决方案.最简单的方法是为您的类编写默认构造函数.

    替代方法永远不会operator[]在地图中使用,因此永远不需要默认构造函数.如果这是你想要做的,插入你写的项目:

    options.insert(std::make_pair(optionName, option));
    

    最后,如果您正在使用C++ 11(或更高版本)以及兼容性足够的编译器,您甚至可以直接将对象构建到容器中:零复制开销,您甚至不需要复制构造函数!

    options.emplace(std::piecewise_construct,
             std::forward_as_tuple(optionName),
             std::forward_as_tuple(valueName, description, type));
    

    2023-02-09 13:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有