如何修复cv :: SVMParams的丢弃限定符[-fpermissive]?

时间:2014-11-24 16:03:24

标签: c++ opencv

我有一个类ConfigFile,它有一个SVMParams成员的getter:

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

代码有点复杂。 m_mapConfig

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

IConfigItemSVMParams的模板类:

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。还是修改它?

2 个答案:

答案 0 :(得分:1)

使您的功能const

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

错误是您在const对象上调用非const方法,编译器拒绝该方法可能不安全。也就是说,您的实现本质上也是非常量的,因为您可能正在将对象插入到地图中,因此仅添加const将无济于事。

您可能想要做的是:

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

答案 1 :(得分:0)

发现问题:我正在使用getSVMParams()调用const ConfigFile&调用的函数;我在shared_ptr中使用的map不允许这样做。 无论如何,谢谢大家!