同时使用…
map<string,CvSVM> classes_classifiers;
classes_classifiers.insert(pair<string,CvSVM>(class_,CvSVM()));
当我编译它时,我得到了错误…
谁能告诉我怎么解决这个问题?我是初学者,我使这个项目区分不同的图像集。我已经下雨了我的SVM,并将不同类别的图像数据保存在不同的文件中。现在我需要预测一下。请帮助谢谢你包含在predict.cpp:10:0的文件中:/usr/include/c++/4.7/bits/stl_pair.h:在实例化' std::pair<_T1,>_T2>::pair(const _T1&, const _T2&) [with _T1 = std::basic_string;_T2 = CvSVM] ';Predict.cpp:99:64:从这里需要/usr/local/include/opencv2/ml/ml.hpp:553:5:错误:' CvSVM::CvSVM(const CvSVM&) '是私有的/usr/include/c++/4.7/utility:72:0从/usr/include/c + +/4.7/算法:61,从/usr/local/include/opencv2/core/core.hpp: 56岁从/usr/local/include/opencv2/highgui/highgui.hpp: 46岁从predict.cpp: 4:/usr/include/c++/4.7/bits/stl_pair.h:105:31: error: within this context
这个错误意味着CvSVM
类的复制构造函数是私有的;因此,您根本无法编写需要复制CvSVM
对象的有效代码。因此,您也不能复制包含CvSVM
对象的类,例如pair。调用map::insert
生成一个副本。
您可能要做的第一件事是检查是否有支持c++ 11的新版本的库。很有可能CvSVM
类可以移动,即使它不能被复制。如果是这样,这段代码应该可以编译而不需要修改一个新版本。
如果没有,但是您有c++ 11支持,您可以在容器中直接构造对象,这样就不需要复制或移动。但是,当容器是映射时,这有点棘手,因为必须构造的值实际上是对,其第二个元素是CvSVM
。你应该这样做:
classes_classifiers.emplace(piecewise_construct, make_tuple(class_), make_tuple());
另一种可能性,如果你有c++ 11的支持,是在你的映射中存储unique_ptr<CvSVM>
对象而不是CvSVM
对象本身。使用unique_ptr
保证当你从映射中删除一个元素时,对象是delete
d:
map<string,unique_ptr<CvSVM>> classes_classifiers;
classes_classifiers.insert(make_pair(class_, unique_ptr<CvSVM>(new CvSVM())));
如果你没有c++ 11支持,你唯一的选择是在你的映射中存储指向CvSVM
的原始指针。这不是最优的,因为它要求您在从映射中擦除指针之前对每个指针进行delete
,否则会泄漏内存。