-2

Intel编译器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

4 回答 4

4

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

  • 移动惰性 ( void std::vector<T>::push_back( T&& value );) 或
  • 可插入复制 ( 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 。

(不幸的是,这使您的问题“不是一个真正的问题”或“过于本地化”。;-))

于 2013-06-16T11:56:05.483 回答
2

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

我的建议是使用下面的声明而不是:

std::vector<int> v;

或者你可以使用 boost::shared_ptr 代替:

std::vector<boost::shared_ptr<int> > v;
于 2013-06-16T11:48:13.873 回答
1

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

于 2013-06-16T12:08:53.987 回答
1

您不能复制 scoped_ptr,正如错误所说,scoped_ptr 的复制构造函数不可用。您可以改用shared_ptr它,它提供几乎相同的功能,但可以解决您的问题。

于 2013-06-16T11:48:10.660 回答