我有将GUID(unsigned long)映射到结构的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 /包括/ C ++ / 4.2.1 /比特/ stl_map.h: 在成员函数'_Tp&amp; std :: map&lt; _Key,_Tp,_Compare, _Alloc&gt; :: operator [](const _Key&amp;)[with _Key = long unsigned int,_Tp = PluginInfo,_Compare = std :: less,_Alloc = std :: allocator&gt;]': mockup_api.cpp:58:实例化 这里 /usr/include/c++/4.2.1/bits/stl_map.h:350: 错误:没有匹配的呼叫功能 到'PluginInfo :: PluginInfo()' mockup_api.cpp:29:注意:候选人 是:PluginInfo :: PluginInfo(GUID, std :: string,Function) mockup_api.cpp:24:注意:
PluginInfo :: PluginInfo(常量 PluginInfo&安培;)
可能出现什么问题?
答案 0 :(得分:3)
您放置在STL容器中的任何对象初始化为初始数量的对象(即,您没有初始化空容器)必须至少有一个默认构造函数...您的没有。换句话说,您当前的构造函数需要使用特定对象进行初始化。必须有一个默认构造函数,如:
PluginInfo();
不需要初始化程序。或者,它们可以是默认初始值设定项,如:
PluginInfo(GUID _guid = GUID(),
std::string _name = std::string(),
Function _function = Function()):
guid(_guid), name(_name), function(_function) {}
答案 1 :(得分:3)
问题是当你说:
pluginDB[1]
你试图在地图中创建一个条目(因为[1]不存在),并且要像Jason所指出的那样,你需要一个默认的构造函数。但是,这不是标准库容器的一般要求,只有std :: map,而std :: map(和multimap等)只有operator [],这就是为什么IMHO operator []用于地图的一个很好的理由等等应该被废除 - 对于新的C ++程序员来说太过混乱了,而对于有经验的程序员则无用。