在使用线路时...
map<string,CvSVM> classes_classifiers;
classes_classifiers.insert(pair<string,CvSVM>(class_,CvSVM()));
当我在整理时,我得到了错误...
谁能告诉我如何解决这个问题。我是初学者,我正在做这个区分不同图像集的项目。
我已经下雨了我的SVM,并已将不同类别的图像的数据保存在不同的文件中。现在我需要预测。
请帮忙
谢谢
最佳答案
该错误意味着CvSVM
类的副本构造函数是私有(private)的;因此,您根本无法编写需要复制CvSVM
对象的有效代码。因此,您不能复制包含CvSVM
对象的类,例如一对。并调用map::insert
进行复制。
您可能要做的第一件事是检查是否有支持C++ 11的较新版本的库。即使无法复制CvSVM
类,也很有可能可以移动它。如果是这样,则该代码应在不对较新版本进行修改的情况下进行编译。
如果不是这样,但是您具有C++ 11支持,则可以直接在容器中构造对象,因此根本不需要复制或移动该对象。但是,当容器是映射时,这有点棘手,因为您必须构造的值实际上是一对,其第二个元素是CvSVM
。这是您的操作方式:
classes_classifiers.emplace(piecewise_construct, make_tuple(class_), make_tuple());
如果您具有C++ 11支持,则另一种可能性是将
unique_ptr<CvSVM>
对象存储在 map 中,而不是CvSVM
对象本身。 unique_ptr
的使用保证了当您从 map 上删除一个元素时,对象就是delete
d:map<string,unique_ptr<CvSVM>> classes_classifiers;
classes_classifiers.insert(make_pair(class_, unique_ptr<CvSVM>(new CvSVM())));
如果您不支持C++ 11,则唯一的选择是在 map 中存储指向
CvSVM
的原始指针。这不是最佳选择,因为它要求您先对每个指针进行delete
编码,然后再将其从 map 中删除,否则会浪费内存。关于c++ - CvSVM(const CvSVM&)’是私有(private)的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22335303/