2013-12-18 47 views
3

我在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中的構造函數採用正確的類型。

+3

**從來沒有**把使用指令放在標題。 – chris

回答

10

這個問題實際上是在下一行:

options[optionName]=option; 

首先調用地圖的operator[],在給定的關鍵searchs並返回相關值。如果未找到密鑰,則會插入與該密鑰相連的默認初始化值。然後這個值被複制分配給你的選項。

您是否看到問題?你的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)); 
+0

我沒有得到它是在談論默認的構造函數。謝謝,很好的答案。 – sigsve

3

標題中的構造函數聲明與源文件中的定義之間存在不匹配。

在頭...

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

在源文件...

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

通知的參數被定義爲參考(例如,串&)在報頭中,但作爲對象(例如,字符串)。

+1

這甚至不應該編譯。 – OldProgrammer

+0

它不會有。這是我的錯誤白色鍵入這個問題,我現在編輯它。謝謝雖然:) – sigsve

相關問題