c++ - 创建不可复制对象的 vector

标签 c++ vector copy-constructor

我正在使用 DenseCRF库,我想生成此对象类的 vector ,但出现以下错误:

/usr/include/c++/4.6/ext/new_allocator.h:108:9: error: no matching function for call to ‘DenseCRF::DenseCRF(const DenseCRF&)’
/densecrf2/include/densecrf.h:48:2: note:   no known conversion for argument 1 from ‘const DenseCRF’ to ‘DenseCRF&’

这是类 DenseCRF.h 的样子:

/**** DenseCRF ****/
class DenseCRF{
protected:
    // Number of variables and labels
    int N_, M_;

    // Store the unary term
    UnaryEnergy * unary_;

    // Store all pairwise potentials
    std::vector<PairwisePotential*> pairwise_;

    // Don't copy this object, bad stuff will happen
    DenseCRF( DenseCRF & o ){}
public:
    // Create a dense CRF model of size N with M labels
    DenseCRF( int N, int M );
    virtual ~DenseCRF();

}

这是精简版的denseCRF.h,提示denseCRF.h有问题的错误:48,引用这段代码第14行:

DenseCRF( DenseCRF & o ){}

在主程序中,我试图创建一个此类的 vector ,但是一旦我想 puch_back 一个对象实例,就会引发上述错误:

std::vector<DenseCRF> crf_vec;
DenseCRF crf(W, H);
crf_vec.push_back(crf);

我在谷歌上搜索了一下,意识到我可能需要定义一个复制构造函数,但不确定如何定义以及在何处定义。有人可以帮我解决这个问题吗?

谢谢!

附言这个问题和第13行作者的评论有关系吗?

最佳答案

可能最简单的事情就是定义

std::vector<std::shared_ptr<DenseCRF>> crf_vec;

相反。然后使用

crf_vec.push_back(new DenseCRF(W, H));

std::shared_ptr是一个智能指针。它将delete一旦 vector 超出范围并且所有其他引用该对象的智能指针也超出范围,该类。这种方法的优点是 std::shared_ptr 确实有一个复制构造函数,因此可以在 std::vector 中使用.

还有一个替代方案:使用安置。但这比较棘手。

(另外,您可以将 DenseCRF( DenseCRF & o ){} 替换为 DenseCRF(DenseCRF&) = delete;。这是复制构造函数的显式删除。)

关于c++ - 创建不可复制对象的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27395900/

相关文章:

c++ - 我应该将什么类型的指针传递给 C++11 中的方法?

c++ - 使用 msbuild 确保在 .NET 项目之前构建 C++ 项目

c++ - 每次我输入长度为 4 的字符串时,下面的 cpp 代码都会崩溃(vector 中的 malloc 失败)

c++ - 如何在C++类中正确使用复制构造函数和赋值

c++ - 将构造函数复制到数组的语法

c++ - C++ 11统一初始化时出现“结构初始化程序中的过多元素”错误

c++ - CUDA 中的一个字符实际占用多少内存?

c++ - GLSL 点积问题

C++ vector : Assert when using vector array index -1?

iphone - 将带有动画的矢量图形嵌入到 iOS 原生应用程序中