加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:33:57 所属栏目:百科 来源:网络整理
导读:我在StackOverflow上看过类似的问题,但似乎没有一个适用于我. 这是我的代码: Option.cpp #include "Option.h"Option::Option(string valueName,string description,OptionType type){ this-valueName = valueName; this-description = description; this-ty
我在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 <iostream>
using namespace std;

enum OptionType { FLAG,REQUIRED,NORMAL };
class Option {
    string valueName,description,value;
    OptionType type;
public:
    Option(string valueName,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,OptionType type) {
    Option option(valueName,type);
    options[optionName]=option;
}

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

}

Options.h

#include <iostream>
#include <unordered_map>
#include "Option.h"

using namespace std;

class Options {
    unordered_map<string,Option> options;
    int argc;
    const char ** argv;

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


};

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

解决方法

问题实际上在下一行:

options[optionName]=option;

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

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

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

另一种方法是永远不要在map中使用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,type));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读