我在C ++ 11中使用MinGW 4.8.0(包含在QtCreator 5.1中)。 问题是我得到编译时错误,但我找不到错误的来源。
typedef std::unique_ptr< ADMessageReqRSSingle > MsgType;
typedef std::vector< MsgType > Cont;
typedef Cont::const_iterator MsgCIter;
Cont mCont; // Inside another clas
是否有更具体的诊断工具?
gcc日志如下:
Makefile.Debug:1491: recipe for target 'debug/adsync.o' failed
In file included from c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\memory:64:0,
from ..\aams/iocontroller/iocontroller.hpp:15,
from ..\aams/aams/aamscontext.h:13,
from ..\aams\src\aams\adsync.cpp:8:
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = std::unique_ptr<aams::device::ADMessageReqRSSingle>; _Args = {const std::unique_ptr<aams::device::ADMessageReqRSSingle, std::default_delete<aams::device::ADMessageReqRSSingle> >&}]':
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_uninitialized.h:75:53: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<aams::device::ADMessageReqRSSingle>*, std::vector<std::unique_ptr<aams::device::ADMessageReqRSSingle> > >; _ForwardIterator = std::unique_ptr<aams::device::ADMessageReqRSSingle>*; bool _TrivialValueTypes = false]'
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_uninitialized.h:117:41: required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<aams::device::ADMessageReqRSSingle>*, std::vector<std::unique_ptr<aams::device::ADMessageReqRSSingle> > >; _ForwardIterator = std::unique_ptr<aams::device::ADMessageReqRSSingle>*]'
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_uninitialized.h:258:63: required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = __gnu_cxx::__normal_iterator<const std::unique_ptr<aams::device::ADMessageReqRSSingle>*, std::vector<std::unique_ptr<aams::device::ADMessageReqRSSingle> > >; _ForwardIterator = std::unique_ptr<aams::device::ADMessageReqRSSingle>*; _Tp = std::unique_ptr<aams::device::ADMessageReqRSSingle>]'
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_vector.h:316:32: required from 'std::vector<_Tp, _Alloc>::vector(const std::vector<_Tp, _Alloc>&) [with _Tp = std::unique_ptr<aams::device::ADMessageReqRSSingle>; _Alloc = std::allocator<std::unique_ptr<aams::device::ADMessageReqRSSingle> >]'
..\aams/aams/device/admessagereq.h:687:50: required from here
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\stl_construct.h:75:7: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = aams::device::ADMessageReqRSSingle; _Dp = std::default_delete<aams::device::ADMessageReqRSSingle>]'
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
^
In file included from c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\memory:81:0,
from ..\aams/iocontroller/iocontroller.hpp:15,
from ..\aams/aams/aamscontext.h:13,
from ..\aams\src\aams\adsync.cpp:8:
c:\qt\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\bits\unique_ptr.h:273:7: error: declared here
unique_ptr(const unique_ptr&) = delete;
^
答案 0 :(得分:1)
根据错误和您对我的评论的回答:
您不能拥有unique_ptr
的容器,因为它不是可复制的,这对于所有STL容器都是必需的。
答案 1 :(得分:1)
你有类似的东西:
class A
{
public:
A() {}
private:
std::vector<std::unique_ptr<int>> ints;
};
所以,A不可复制(因为unique_ptr
不是),
要获得更好的错误消息,您可以明确添加
A(const A&) = delete;
A& operator = (const A&) = delete;
以下代码显示您的错误消息。
int main() {
A a, b;
a = b; // Error appears due to this copy
return 0;
}
如果合适,您可以使用move
代替复制。
int main() {
A a, b;
a = std::move(b); // No error, but b is now "invalid"
return 0;
}
编辑:只需在另一个答案的评论中看到你对克隆的评论:
克隆是副本(并且A不可复制,因此出错)。
你可以使用(如果适用的话):
std::unique_ptr<A> A::Clone() const {
std::unique_ptr<A> res(new A());
for (auto i : ints) {
// copy the value, not the pointer.
res->ints.push_back(std::unique_ptr<int>(new int(*i)));
}
return res;
}
答案 2 :(得分:1)
向量中的项目必须是可分配的(或者,在标准的最新版本中,可移动)。
您的编译器似乎不足以接受可移动部分。 如果您创建了一个也不可赋值的const对象向量,则任何人可能会遇到此错误的另一个可能原因。