2014-11-24 26 views
0

我有一個類ConfigFile實現具有用於SVMParams成員吸氣:如何爲cv :: SVMParams修復丟棄限定符[-fpermissive]?

cv::SVMParams gerSVMParams() 
{ 
    return *m_mapConfig["SVMParams"]; 
} 

的代碼是更復雜一點。 m_mapConfig

std::map<std::string, std::unique_ptr<IConfigItem> > 

而且IConfigItem是一個模板類,看起來像這樣的SVMParams

template<> class ConfigItem<cv::SVMParams> : public IConfigItem 
{ 
private: 
    cv::SVMParams m_value; 

public: 
    ConfigItem(const cv::SVMParams& valueIn) : m_value(valueIn) {} 

    operator cv::SVMParams() const 
    { 
     return m_value; 
    } 
}; 

我的問題是,當我試圖自動訓練SVM分類:

classifier.train_auto(trainingData, classes, cv::Mat(), cv::Mat(), configFileIn.getSVMParams()); 

我收到種類的錯誤:

error: passing ‘const ConfigFile’ as ‘this’ argument of ‘cv::SVMParams ConfigFile::getSVMParams()’ discards qualifiers [-fpermissive] 

的什麼,我做錯了什麼建議?或者是有一個小錯誤,因爲train_auto函數在SVMParams參數前沒有const。還是它在修改它?

+0

順便說一句,你似乎使用主分支的過時版本?它在今年夏天進行了一次重大的重構。 – berak 2014-11-24 16:20:19

+0

是的,我知道有OpenCV 3.0.0測試版,但我並不是真的想改變所有的應用程序,因爲有一個重大的改變。 – sop 2014-11-24 16:24:10

+0

^^理解。實際上,代碼看起來完全不同。 – berak 2014-11-24 16:25:26

回答

0

發現了問題:我被調用函數中,我打電話了getSVMParams()const ConfigFile&;這是我在map中使用的shared_ptr所不允許的。 謝謝大家,反正!

1

讓你的函數const

cv::SVMParams gerSVMParams() const 
//       ^^^^^ 

的錯誤是你調用一個const對象,編譯器會拒絕爲潛在的不安全對非const方法。也就是說,你的實現本質上也是非const的,因爲你可能會插入一個對象到你的地圖中,所以只需添加const就沒有幫助。

你可能想要做的是:

cv::SVMParams gerSVMParams() const 
//       ^^^^^ 
{ 
    auto it = m_mapConfig.find("SVMParams"); 
    if (it != m_mapConfig.end()) { 
     return *(*it); 
    } 
    else { 
     return {}; // maybe? 
    } 
} 
+0

我已經試過這一點,但它不是這個問題......它說:'錯誤:通過「常量的std ::地圖<性病:: basic_string的,性病::的unique_ptr >」爲「本」的「說法std :: map <...'放棄限定符[-fpermissive]' – sop 2014-11-24 16:26:46

相關問題