c ++“没有匹配函数用于调用”结构错误

时间:2011-04-18 20:29:02

标签: stl map g++

我有将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&安培;)

可能出现什么问题?

2 个答案:

答案 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 ++程序员来说太过混乱了,而对于有经验的程序员则无用。