我有以下代码:
#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>&&’
是什么原因?
答案 0 :(得分:5)
你需要说:
return { make_shared<const A<U>>(*this) };
// ^^^
答案 1 :(得分:0)
根据文档,make_shared
构造一个给定类型为ant的新实例,然后将其包装到shared_ptr中。您正在尝试使用类型A *构造A的新实例。它是shared_ptr
的构造函数,它将指针作为参数,而不是make_shared
。