1

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;
           ^
4

3 に答える 3

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;
}

編集:別の回答のコメントでクローンに関するコメントを参照してください:

Clone はコピーです (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;
}
于 2013-09-19T16:01:09.723 に答える