没有用于初始化的匹配构造函数
No matching constructor for initialization of
我在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&),但在源中定义为对象(例如字符串)。
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 内置类型的构造函数初始化
- 构造函数初始化和对象损坏