英特尔编译器 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&)'
有什么问题?
答案 0 :(得分: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。
(不幸的是,你的问题“不是真正的问题”或“过于本地化”。; - ))
答案 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最接近的等价物。