У меня есть следующий код:
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? Если так, как я могу обойти это?
Спасибо
Вызов
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
будет скопирован в карту.
Когда вы используете lut["a"]
в вашей основной функции map должна возвращать ссылку на инициализированное значение типа STFRandomTreeFunctor
и как вы видите, у него нет параметров для создания и инициализации этого экземпляра, поэтому он использует конструктор по умолчанию вашего класса, а у вашего класса нет конструктора по умолчанию. поэтому вы должны либо написать конструктор по умолчанию для вашего класса, либо использовать:
lut.insert( std::make_pair("a", STFRandomTreeFunctor(cache, a, "a")) );
Поместите ваши определения структуры на вершине, в основном он пытается построить 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");
}