2011-04-18 81 views
2

我有C++代碼將GUID(無符號長整型)映射到結構。C++「沒有匹配函數調用」的錯誤結構

#include <string> 
#include <map> 
#include <iostream> 

typedef unsigned long GUID; 

enum Function { 
    ADDER = 1, 
    SUBTRACTOR = 2, 
    MULTIPLIER = 3, 
    SQUAREROOT = 4 
}; 

struct PluginInfo 
{ 
    GUID guid; 
    std::string name; 
    Function function; 

    PluginInfo(GUID _guid, std::string _name, Function _function) {guid = _guid, name = _name, function = _function;} 
}; 

typedef std::map<GUID, PluginInfo> PluginDB; 

PluginInfo temp1(1, "Adder", ADDER); 
PluginInfo temp2(2, "Multiplier", MULTIPLIER); 

PluginDB::value_type pluginDbArray[] = { 
    PluginDB::value_type(1, temp1), 
    PluginDB::value_type(2, temp2) 
}; 

const int numElems = sizeof pluginDbArray/sizeof pluginDbArray[0]; 
PluginDB pluginDB(pluginDbArray, pluginDbArray + numElems); 

int main() 
{ 
    std::cout << pluginDB[1].name << std::endl; 
} 

當我編譯它時,我收到了錯誤信息。

/usr/include/c++/4.2.1/bits/stl_map.h: In member function ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = long unsigned int, _Tp = PluginInfo, _Compare = std::less, _Alloc = std::allocator >]’: mockup_api.cpp:58: instantiated from here /usr/include/c++/4.2.1/bits/stl_map.h:350: error: no matching function for call to ‘PluginInfo::PluginInfo()’ mockup_api.cpp:29: note: candidates are: PluginInfo::PluginInfo(GUID, std::string, Function) mockup_api.cpp:24: note:
PluginInfo::PluginInfo(const PluginInfo&)

什麼可能是錯誤的?

+0

可能重複的[無法訪問std :: map中的結構值](http://stackoverflow.com/questions/36636610/cannot-access-struct-value-in-stdmap) – Yakk 2016-04-15 01:50:12

回答

3

你放入一個STL容器中的任何對象都是用最初的對象數初始化的(即,你沒有初始化一個空容器)必須至少有一個默認的構造函數......你的沒有。換句話說,你當前的構造函數需要用特定的對象來初始化。必須有一個默認構造函數,如下所示:

PluginInfo(); 

不需要初始值設定項。或者,他們可以默認初始化,如:

PluginInfo(GUID _guid = GUID(), 
      std::string _name = std::string(), 
      Function _function = Function()): 
      guid(_guid), name(_name), function(_function) {} 
+0

如果你的意思是他們必須有一個默認的構造函數,這是錯誤的。 STL容器當然可以包含沒有默認構造函數的對象。要求是它們是可複製和可分配的。 – 2011-04-18 20:34:38

+0

不,對不起,並沒有明確表示......我試着修改我的答案以糾正這個假設,並顯示你可以有替代的構造函數,但它們必須是可以初始化的東西,而不必傳入任何明確的用戶參數。 – Jason 2011-04-18 20:37:10

+0

@Jason這樣的構造函數是一個默認的構造函數 - 你的答案仍然是錯誤的。 – 2011-04-18 20:38:34

3

的問題是,當你說:

pluginDB[1] 

嘗試創建的映射中的條目(因爲[1]不存在)和像Jason指出的那樣做,你需要一個默認的構造函數。然而,這不是標準庫容器的一般要求,只是std :: map的唯一標準庫容器,並且只適用於std :: map(和multimap等)的運算符[],這是爲什麼IMHO運算符[] for maps et al應該被廢除 - 對於新的C++程序員來說,這太令人困惑了,對於經驗豐富的程序員來說也是無用的。

+0

+1 Good catch :) ...並感謝上面的澄清以及... – Jason 2011-04-18 21:17:04

相關問題