为什么shared_ptr <t>需要T?</t>中的复制/移动构造函数

时间:2013-05-08 12:46:00

标签: c++ templates c++11 shared-ptr copy-constructor

我有以下代码:

#include <memory>

using namespace std;

template<typename U> class A;

template<typename U>
class B
{
    private:
        shared_ptr<const A<U>> _a;
    public:
        B (shared_ptr<const A<U>> __a) {
            _a = __a;
        }
};

template<typename U>
class A
{
    public:
        B<U> foo () const {
            return { make_shared<const A<U>> (this) };
        }
};

int
main ()
{
    A<int> a;
    B<int> b = a.foo ();

    return 0;
}

G ++ 4.8.0和Clang 3.3svn报告类A没有复制或移动构造函数。对于 例如,G ++打印以下消息:

/home/alessio/Programmi/GCC/include/c++/4.8.0/ext/new_allocator.h:120:4: error: no      matching function for call to ‘A<int>::A(const A<int>* const)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
  ^
/home/alessio/Programmi/GCC/include/c++/4.8.0/ext/new_allocator.h:120:4: note:  candidates are:
prova.cpp:19:7: note: constexpr A<int>::A()
 class A
       ^
prova.cpp:19:7: note:   candidate expects 0 arguments, 1 provided
prova.cpp:19:7: note: constexpr A<int>::A(const A<int>&)
prova.cpp:19:7: note:   no known conversion for argument 1 from ‘const A<int>* const’ to    ‘const A<int>&’
prova.cpp:19:7: note: constexpr A<int>::A(A<int>&&)
prova.cpp:19:7: note:   no known conversion for argument 1 from ‘const A<int>* const’ to  ‘A<int>&&’

是什么原因?

2 个答案:

答案 0 :(得分:5)

你需要说:

return { make_shared<const A<U>>(*this) };
//                              ^^^

答案 1 :(得分:0)

根据文档,make_shared构造一个给定类型为ant的新实例,然后将其包装到shared_ptr中。您正在尝试使用类型A *构造A的新实例。它是shared_ptr的构造函数,它将指针作为参数,而不是make_shared