unique_ptr 没有已知的转换,前向声明?

No known conversion from unique_ptr, forward declaration?

class Base{};

class C;
class A : Base {
    unique_ptr<Base> x;
    unique_ptr<A> y;

    someMethod (){
        if (sth) {
            x = make_unique<C>(); // error no viable overloaded '=', see below
        }
    }
}

class B : Base {
    A x;
    unique_ptr<B> y;
}

class C : Base {
    B x;
}

我该如何解决这个问题? 类 的大小应该是可确定的。这是我所知道的一切。我也可以将成员变量 A xC x 作为指针,并将 B 和 C 移动到 A 之上,但我想我会得到同样的错误,但对于 A.

error: no viable overloaded '='
candidate function not viable: no known conversion from 'unique_ptr<C, default_delete<C>>' to 'unique_ptr<Base, default_delete<Base>>

C 在调用 std::make_unique() 时必须是完整类型,但在您的代码中 C 仅在调用 std::make_unique() 时被转发声明,因此它不会不知道 C 实际上有多大,所以它可以分配 std::unique.

只需在 C 完全定义后移动 A::someMethod() 的实现(例如到 .cpp 文件),例如:

class Base {
public:
    virtual ~Base() {}
};

class C;
class A : public Base {
    unique_ptr<Base> x;
    unique_ptr<A> y;

    void someMethod();
};

class B : public Base {
    A x;
    unique_ptr<B> y;
};

class C : public Base {
    B x;
};

...

void A::someMethod()
{
    if (sth) {
        x = make_unique<C>();
    }
}