【问题标题】:CvSVM(const CvSVM&)’ is privateCvSVM(const CvSVM&)' 是私有的
【发布时间】:2014-04-15 15:07:33
【问题描述】:

使用线路时...

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

【问题讨论】:

    标签: c++ opencv svm


    【解决方案1】:

    那个错误意味着CvSVM类的拷贝构造函数是私有的;因此,您根本无法编写需要复制CvSVM 对象的有效代码。因此,您也不能复制包含CvSVM 对象的类,例如一对。并调用map::insert 进行复制。

    您可能想要做的第一件事是检查是否有支持 C++11 的库的更新版本。 CvSVM 类很可能即使无法复制也可以移动。如果是这样,这段代码应该可以在不修改新版本的情况下编译。

    如果没有,但支持C++11,你可以直接在容器中构造对象,这样就不需要复制 完全动了。但是,当容器是地图时,这有点棘手,因为您必须构造的值实际上是一个 pair,其 second 元素是 CvSVM。这就是你的做法:

    classes_classifiers.emplace(piecewise_construct, make_tuple(class_), make_tuple());
    

    如果您有 C++11 支持,另一种可能性是将 unique_ptr&lt;CvSVM&gt; 对象存储在您的地图中,而不是 CvSVM 对象本身。 unique_ptr的使用保证了当你从map中移除一个元素时,对象是deleted:

    map<string,unique_ptr<CvSVM>> classes_classifiers;
    classes_classifiers.insert(make_pair(class_, unique_ptr<CvSVM>(new CvSVM())));
    

    如果您没有 C++11 支持,您唯一的选择是在映射中存储指向 CvSVM 的原始指针。这不是最佳的,因为它要求您在从映射中删除每个指针之前delete,否则您会泄漏内存。

    【讨论】:

    • make_pair 是 stl_pair.cpp 的函数吗??
    • make_pair 定义在 &lt;utility&gt; 标头中,这与您必须包含的相同标头才能使用对。 unique_ptr 可以像普通指针一样使用,但不能复制,并且在销毁时会自动删除其引用。
    • 当我使用 map&lt;string,unique_ptr&lt;CvSVM&gt;&gt; classes_classifiers; 编译时。我收到错误,说 unique_ptr 未定义。
    • std::unique_ptr&lt;memory&gt; 标头中定义
    • 先生,我正在使用#include &lt;memory&gt; and still getting ‘unique_ptr’ 未在此范围内声明`。我现在该怎么办。
    猜你喜欢
    • 2015-03-25
    • 2011-08-23
    • 2015-03-28
    • 2011-07-10
    • 2014-09-08
    • 2016-01-22
    • 2015-10-06
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多