我在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
#includeusing 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中的构造函数采用了正确的类型.
问题实际上在下一行:
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));