【问题标题】:Creating a vector of non-copyable objects创建不可复制对象的向量
【发布时间】:2014-12-10 07:59:03
【问题描述】:

我正在使用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有问题的错误,参考此代码sn-p中的第14行:

DenseCRF( DenseCRF & o ){}

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

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

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

谢谢!

附:这个问题和第13行作者的cmets有关系吗?

【问题讨论】:

  • A std::vector&lt;T&gt; 需要 T 提供正确的复制构造函数,如 reference documentation 中所述。
  • @πάνταῥεῖ C++11 放宽了要求

标签: c++ vector copy-constructor


【解决方案1】:

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

std::vector&lt;std::shared_ptr&lt;DenseCRF&gt;&gt; crf_vec;

相反。然后使用

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

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

还有一个替代方案:使用 emplacement。但这更棘手。

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

【讨论】:

  • 谢谢,但是当我尝试通过包含 来使用 std::shared_ptr 时,它会引发错误,即“std::shared_ptr”未在此范围内声明。
  • 你可以试试 std::tr1::shared_ptr 或者在编译器中加入 -std=c++11
  • @user3517598 您使用的是 GCC 4.6 吗?确保指定-std=c++0x
  • @Sergey std::shared_ptr 应该优先于 tr1 版本。标志 c++11 在 4.6 中不存在。这是c++0x
  • 抱歉,但在进行这些更改后,现在我收到此错误:'/densecrf2/examples/dense_learning_default.cpp:188:39: 错误:没有匹配函数调用'std::vector <:shared_ptr> >::push_back(DenseCRF*)''.
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2023-03-07
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多