使用线...
map<string,CvSVM> classes_classifiers;
classes_classifiers.insert(pair<string,CvSVM>(class_,CvSVM()));
当我感染它时,我收到错误......
包含在predict.cpp中的文件:10:0: /usr/include/c++/4.7/bits/stl_pair.h:实例化'std :: pair&lt; _T1,&gt; _T2&gt; :: pair(const _T1&amp;,const _T2&amp;)[with _T1 = std :: basic_string ; _T2 = CvSVM]': predict.cpp:99:64:从这里需要 /usr/local/include/opencv2/ml/ml.hpp:553:5:错误:'CvSVM :: CvSVM(const CvSVM&amp;)'是私有的 在/usr/include/c++/4.7/utility:72:0中包含的文件中, 来自/usr/include/c++/4.7/algorithm: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:错误:在此上下文中
任何人都可以告诉我怎么解决这个问题。我是初学者,我正在制作这个项目,区分不同的图像集。 我已经下了我的SVM并保存了不同文件中不同类图像的数据。现在我需要预测。 请帮忙 谢谢
答案 0 :(得分:4)
该错误意味着CvSVM
类的复制构造函数是私有的;因此,您根本无法编写需要复制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>
个对象而不是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
每个指针,否则你会泄漏内存。