0
4

3 に答える 3

1

呼び出し

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

于 2012-10-26T17:59:11.470 に答える
1

メイン関数で使用するlut["a"]と、 map は型の初期化された値への参照を返す必要がありSTFRandomTreeFunctorます。ご覧のとおり、そのインスタンスを作成および初期化するためのパラメーターがないため、クラスのデフォルトコンストラクターを使用し、クラスにはデフォルトコンストラクターがありません. そのため、クラスのデフォルトのコンストラクターを作成するか、次を使用する必要があります。

lut.insert( std::make_pair("a", STFRandomTreeFunctor(cache, a, "a")) );
于 2012-10-26T18:06:48.837 に答える
0

構造体の定義を一番上に置きます。基本的には構築しようとして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");
}
于 2012-10-26T17:54:33.637 に答える