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

No matching constructor for initialization of

本文关键字:构造函数 初始化 用于      更新时间:2023-10-16

我在StackOverflow上看到过类似的问题,但似乎都不适用于我。

这是我的代码:


选项.cpp

#include "Option.h"
Option::Option(string valueName, string description, OptionType type){
this->valueName = valueName;
this->description = description;
this->type = type;
};


选项.h

#include <iostream>
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;
};
};


选项.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) {
}


选项.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, string valueName, string description, OptionType type);
void addFlag(string flagName, string description);
void addOptionAlias(string aliasName, string optionName);
void getOption(string optionName);
void printHelp();

};

它在选项中.cpp在错误似乎源于的行Option option(valueName, description, type);上,但对于我的生活,我不知道为什么。 据我所知,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));

标头中的构造函数声明与源文件中的定义不匹配。

在标题中...

Option(string& valueName, string& description, OptionType& type);

在源文件中...

Option::Option(string valueName, string description, OptionType type){

请注意,参数在标头中定义为引用(例如string&),但在源中定义为对象(例如字符串)。