2012-10-26 132 views
0

我有以下代碼:C++:tusing升壓unordered_map錯誤:沒有匹配的函數調用

結構STFRandomTreeFunction { 的typedef雙(* function_ptr)(常量STFDataPoint &數據,助推:: 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?如果是這樣,我該如何解決這個問題?

感謝

回答

1

呼叫

lut["a"] = x; 

將首先在themap(cfr。operator[]:「效果: )中創建一個空條目如果容器doe s不包含具有等於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將被複制到地圖。

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"); 
} 
+0

噢,對不起,我只是複製他們在錯誤的,結構是其中包含的頭文件實際上定義,我會編輯帖子以反映這一點 – Aly

1

當您在主函數中使用lut["a"]時,map應返回對STFRandomTreeFunctor類型的初始化值的引用,如您所見,它沒有創建和初始化該實例的參數,因此它使用您的類的默認構造函數並你的類沒有默認的構造函數。所以您應該寫一個默認的構造函數類或使用:

lut.insert(std::make_pair("a", STFRandomTreeFunctor(cache, a, "a"))); 
相關問題