CvSVM(const CvSVM&)'是私有的

时间:2014-03-11 19:57:01

标签: c++ opencv svm

使用线...

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并保存了不同文件中不同类图像的数据。现在我需要预测。 请帮忙 谢谢

1 个答案:

答案 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每个指针,否则你会泄漏内存。