我正在使用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();
}
这是密集型CRF.h的精炼版本,该错误指示密集型CRF.h:48的错误,请参见此代码段的第14行:
DenseCRF( DenseCRF & o ){}
在主程序中,我试图创建此类的向量,但是一旦我想要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
该类。这种方法的优点是std::shared_ptr
确实具有副本构造函数,因此可以在std::vector
中使用。
还有一种选择:使用安置。但这比较棘手。
(此外,您可以将DenseCRF( DenseCRF & o ){}
替换为DenseCRF(DenseCRF&) = delete;
。这是对副本构造函数的显式删除。)