3 に答える
呼び出し
lut["a"] = x;
themap
最初に(cfr. operator[] : "効果: コンテナーに 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
ただし、この方法では、新しく作成されたコンストラクターがマップにコピーされるため、コピー コンストラクター (またはmove-constructor ) が必要になります。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");
}