我有2个类:父类和子类,每个类都具有shared_ptr,我在构造过程中初始化了子类。
代码无法编译,错误消息为:
错误C2664:'Parent :: Parent(Parent &&)':无法转换参数1 从'_Ty'到'const Parent&'
下面的示例说明了该问题。 问题是,我该怎么做才能使以下代码编译:
#include <memory>
class Child;
class Parent :
public std::enable_shared_from_this<Parent>
{
public:
Parent()
{
mpChild = std::make_shared<Child>(
std::make_shared<Parent>(shared_from_this()));
}
private:
std::shared_ptr<Child> mpChild;
};
class Child
{
public:
Child(std::shared_ptr<Parent> parent) :
mpParent(parent) { }
private:
std::shared_ptr<Parent> mpParent;
};
int main()
{
Parent test; // error C2664
return 0;
}
答案 0 :(得分:0)
我遇到了另一个错误,但是复制,粘贴和编译代码使我在以下语句上出现错误,并且我同意编译器该语句很奇怪:
mpChild = std::make_shared<Child>( std::make_shared<Parent>(shared_from_this()));
上下文是这是在Parent
的构造函数中。让我们从内到外地工作(首先评估到最后评估)。最里面的调用是shared_from_this()
,它返回一个shared_ptr
。然后,此值是std::make_shared<Parent>
的输入。也就是说,make_shared
应该为新的Parent
对象分配内存,然后通过调用将Parent
作为参数的shared_ptr
构造函数来初始化它。
有一个问题。实际上是几个,但是表面上的是Parent
没有采用shared_ptr
的构造函数。因此编译失败。
第二个问题是Parent
的构造函数正在构造一个新的Parent
对象,如果算出了语法,它看起来像是无限递归。