boost :: scoped_ptr的向量时未定义的引用

时间:2013-06-16 11:42:45

标签: c++ boost vector

英特尔编译器 icpc版本13.0.1(gcc版本4.4.6兼容性)

#include "boost/scoped_ptr.hpp"
#include <vector>

int main()
{
    std::vector<boost::scoped_ptr<int> > v;
    v.push_back(boost::scoped_ptr<int> (new int(127)));

    return 0;
}

icpc bbb21.cpp

/devjuser1/jp/ccjp/avinokur/tmp/icpclHkUcJ.o: In function `main':
bbb21.cpp:(.text+0xfa): undefined reference to `boost::scoped_ptr<int>::scoped_ptr(boost::scoped_ptr<int> const&)'
bbb21.cpp:(.text+0x136): undefined reference to `boost::scoped_ptr<int>::scoped_ptr(boost::scoped_ptr<int> const&)'
bbb21.cpp:(.text+0x195): undefined reference to `boost::scoped_ptr<int>::scoped_ptr(boost::scoped_ptr<int> const&)'
bbb21.cpp:(.text+0x254): undefined reference to `boost::scoped_ptr<int>::scoped_ptr(boost::scoped_ptr<int> const&)'

有什么问题?

4 个答案:

答案 0 :(得分:4)

std::vector::push_back()使用的类型必须是

  • move-inertible(void std::vector<T>::push_back( T&& value );)或
  • copy-insertible(void std::vector<T>::push_back( const T& value );)。

请参阅cppreference.com, std::vector::push_back()

Boost docs (1.53), scoped_ptr表明scoped_ptr可以从指针构造,但不能复制或移动构造。

说明

  

scoped_ptr不能在C ++标准库容器中使用。如果您需要可以使用的智能指针,请使用shared_ptr

(不幸的是,你的问题“不是真正的问题”或“过于本地化”。; - ))

答案 1 :(得分:2)

boost::scoped_ptr不可复制,而STL容器需要元素可复制构建。

我的建议是在下面使用以下情况:

std::vector<int> v;

或者你可以改用boost :: shared_ptr:

std::vector<boost::shared_ptr<int> > v;

答案 2 :(得分:1)

您无法复制scoped_ptr,如错误所示,scoped_ptr的复制构造函数不可用。您可以使用shared_ptr代替,它提供几乎相同的功能,但可以解决您的问题。

答案 3 :(得分:1)

如果您有在STL中实现移动语义的现代实现,请使用std::vector<std::unique_ptr<int> >。这是与scoped_ptr最接近的等价物。