我有一个类ConfigFile,它有一个SVMParams成员的getter:
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 :(得分: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
不允许这样做。
无论如何,谢谢大家!