gpt4 book ai didi

c++ - 没有已知的来自 unique_ptr 的转换,前向声明?

转载 作者:行者123 更新时间:2023-11-28 04:52:23 24 4
gpt4 key购买 nike

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

关于c++ - 没有已知的来自 unique_ptr 的转换,前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com