c ++ "нет подходящей функции для вызова" ошибка со структурой - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть код C ++, который отображает GUID (unsigned long) в структуру.

#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 & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] (const _Key &) [с _Key = длинным беззнаковым int, _Tp = PluginInfo, _Compare = std :: less, _Alloc = std :: allocator>] ’: 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 (Const PluginInfo &)

Что может быть не так?

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Проблема в том, что когда вы говорите:

 pluginDB[1]

вы пытаетесь создать запись на карте (потому что [1] не существует) и сделать это, как указывает Джейсон, вам нужен конструктор по умолчанию. Однако это НЕ является общим требованием к стандартным контейнерам библиотеки, только к std :: map и только к operator [] для std :: map (и multimap и т. Д.), Что является хорошей причиной, почему оператор IMHO [] для карт с этим следует покончить - это слишком запутанно для новых программистов на C ++ и бесполезно для опытных.

3 голосов
/ 19 апреля 2011

Любые объекты, которые вы помещаете в контейнер STL, инициализированный с начальным числом объектов (т. Е. Вы не инициализируете пустой контейнер), должны иметь по крайней мере один конструктор по умолчанию ... ваш не имеет. Другими словами, ваш текущий конструктор должен быть инициализирован с конкретными объектами. Должен быть один конструктор по умолчанию, например:

PluginInfo();

Не требует инициализаторов. В качестве альтернативы они могут быть инициализаторами по умолчанию, такими как:

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