创建不可复制对象的向量

时间:2014-12-10 07:59:03

标签: c++ vector copy-constructor

我正在使用DenseCRF库,我想生成此对象类的向量,但是我收到以下错误:

/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 ){}

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

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

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

谢谢!

P.S。这个问题与第13行中作者的评论有什么关系吗?

1 个答案:

答案 0 :(得分:2)

最简单可能要做的事情是定义

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

代替。然后使用

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

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

还有另一种方法:使用安置。但那太棘手了。

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