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