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)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容