C ++: Tusing Boost Unordered_map Ошибка: нет соответствующего вызова функции

У меня есть следующий код:

struct STFRandomTreeFunction
{
typedef double (* function_ptr) (const STFDataPoint& данные, boost :: unordered_map& preloaded_images);
};

struct STFRandomTreeFunctor
{
private:
boost::unordered_map<std::string, cv::Mat> *image_cache;
STFRandomTreeFunction::function_ptr function;
std::string function_id;

public:
STFRandomTreeFunctor(boost::unordered_map<std::string, cv::Mat>& cache, STFRandomTreeFunction::function_ptr function, std::string function_id)
:image_cache(&cache), function(function), function_id(function_id){}

std::string get_function_id(){
return function_id;
}

double operator()(const TrainingDataPoint& data_point){
return function(data_point, *image_cache);
}
};

unordered_map<string, STFRandomTreeFunctor> lut;

double a(const STFDataPoint& b, unordered_map<string, Mat>& c){
return 5;
}

int main(int argc, char* argv[]) {

unordered_map<string, Mat> cache;
lut["a"] = STFRandomTreeFunctor(cache, a, "a");
}

когда я пытаюсь собрать, я получаю следующую ошибку: boost/unordered/detail/allocate.hpp:262:1: error: no matching function for call to ‘STFRandomTreeFunctor::STFRandomTreeFunctor()’

Но я понятия не имею, почему буст пытается позвонить STFRandomTreeFunctor()Это потому, что когда мы создаем пустую карту, он пытается создать STFRandomTreeFunctor? Если так, как я могу обойти это?

Спасибо

0

Решение

Вызов

lut["a"] = x;

сначала создаст пустую запись в themap (Ср. Оператор []: «Последствия:
Если контейнер еще не содержит элементов с ключом, эквивалентным k, вставляется значение std::pair<key_type const, mapped_type>(k, mapped_type())«). Строить mapped_type() ему нужен конструктор по умолчанию.

Если вы хотите избежать этого, используйте insert функция:

bool inserted=lut.insert( std::make_pair("a",x) ).second;
assert(inserted); // unless it's ok to not overwrite already inserted keys

Но так вам понадобится конструктор копирования (или шаг-конструктор), так как недавно созданный pair будет скопирован в карту.

1

Другие решения

Когда вы используете lut["a"] в вашей основной функции map должна возвращать ссылку на инициализированное значение типа STFRandomTreeFunctor и как вы видите, у него нет параметров для создания и инициализации этого экземпляра, поэтому он использует конструктор по умолчанию вашего класса, а у вашего класса нет конструктора по умолчанию. поэтому вы должны либо написать конструктор по умолчанию для вашего класса, либо использовать:

lut.insert( std::make_pair("a", STFRandomTreeFunctor(cache, a, "a")) );
1

Поместите ваши определения структуры на вершине, в основном он пытается построить unordered_map<string, STFRandomTreeFunctor> lut; но не могу найти определение для вашей структуры 🙂

struct STFRandomTreeFunction
{
typedef double (*function_ptr)(const STFDataPoint& data, boost::unordered_map<std::string, cv::Mat>& preloaded_images);
};

struct STFRandomTreeFunctor
{
private:
boost::unordered_map<std::string, cv::Mat> *image_cache;
STFRandomTreeFunction::function_ptr function;
std::string function_id;

public:
STFRandomTreeFunctor(boost::unordered_map<std::string, cv::Mat>& cache, STFRandomTreeFunction::function_ptr function, std::string function_id)
:image_cache(&cache), function(function), function_id(function_id){}

std::string get_function_id(){
return function_id;
}

double operator()(const TrainingDataPoint& data_point){
return function(data_point, *image_cache);
}
};

unordered_map<string, STFRandomTreeFunctor> lut;

double a(const STFDataPoint& b, unordered_map<string, Mat>& c){
return 5;
}

int main(int argc, char* argv[]) {

unordered_map<string, Mat> cache;
lut["a"] = STFRandomTreeFunctor(cache, a, "a");
}
0
По вопросам рекламы [email protected]