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

时间:2013-12-18 20:49:53

标签: c++

我在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, 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 <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();


};

Option option(valueName, description, type);行的options.cpp中,错误似乎源于此,但对于我的生活,我无法弄清楚原因。据我所知,Option中的构造函数采用了正确的类型。

2 个答案:

答案 0 :(得分:10)

问题实际上在下一行:

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));

答案 1 :(得分:3)

标题中构造函数的声明与源文件中的定义之间存在不匹配。

在标题中......

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

在源文件中......

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

请注意,参数在标题中定义为引用(例如字符串&amp; ),但在源代码中定义为对象(例如字符串)。