2016-05-18 49 views
0

我需要一个拷贝构造函数我Immagine类是这样的:C++:拷贝构造函数,使用功能与非const参数

Immagine::Immagine(Immagine& i) 
{ 
    ... 
} 

obviusly,当我尝试调用它,我有这样的事: error: invalid initialization of non-const reference of type ‘Immagine&’ from an rvalue of type ‘Immagine’,因为我想声明为:

Immagine::Immagine(const Immagine& i) 
{ 
    ... 
} 

但我不能这样做,因为,到iniatialize的想象,成员对象,我用一个函数

Immagine::Immagine(const Immagine& i) 
{ 
    dlib::array2d<dlib::rgb_pixel>& r=i.v; //v is a member of type dlib::array2d<dlib::rgb_pixel> 
    dlib::assign_image(this->dlib_immagine,r); 
} 

功能dlib::assign_image(dst,src)是包功能,并复制到srcdstsrc参数声明没有const,所以如果我宣布iconst我得到一个错误......我该如何解决这个问题?

+1

我没有看到你用'i' ... – vu1p3n0x

+1

你在你的例子中插入了一个'... something ...'blackbox,这使得它不可能推断出任何东西。我怀疑你在'assign_image'出现错误。 'r'已经是一个非const引用。 – luk32

+1

你确定吗?他们的源代码显示'dlib :: assign_image()'接受一个const'src_img'参数。 http://dlib.net/dlib/image_transforms/assign_image_abstract.h.html#assign_image或者你是否使用一些旧版本 – vu1p3n0x

回答

5

假如你不能改变dlib::assign_image()采取const Immagine,并且要确保它实际上不会改变任何东西,那么我会用const_casti去除常量性。

一般而言,如果您有其他选项,最好不要使用const_cast,但在调用不是常量正确但代码不正确的遗留代码时最好使用IMO const_cast

+0

const_cast似乎只是用指针工作... – volperossa

+1

@volperossa我还没有尝试过,但我认为它也可以与引用一起工作。我可以看到它不能与实例一起工作(因为这会导致对象复制)。 – Andy