C++ 没有从唯一的ptr、转发声明的已知转换?
调用C++ 没有从唯一的ptr、转发声明的已知转换?,c++,unique-ptr,C++,Unique Ptr,调用std::make_unique()时,C必须是一个完整的类型,但是在您的代码中,C只有在调用std::make_unique()时才被向前声明,所以它不知道C实际有多大,所以它可以分配std::unique 在完全定义C之后(例如到.cpp文件),只需移动A::someMethod()的实现,例如: 类基{ 公众: 虚拟~Base(){} }; 丙级;; A类:公共基地{ 独特的ptr x; 独特性; 无效方法(); }; B类:公共基地{ A x; 独特性; }; 丙级:公共基地{ bx
std::make_unique()
时,C
必须是一个完整的类型,但是在您的代码中,C
只有在调用std::make_unique()
时才被向前声明,所以它不知道C
实际有多大,所以它可以分配std::unique
在完全定义C
之后(例如到.cpp
文件),只需移动A::someMethod()
的实现,例如:
类基{
公众:
虚拟~Base(){}
};
丙级;;
A类:公共基地{
独特的ptr x;
独特性;
无效方法();
};
B类:公共基地{
A x;
独特性;
};
丙级:公共基地{
bx;
};
...
void A::someMethod()
{
如果(某事物){
x=使_唯一();
}
}
您也可以使用。为什么我测试的答案被删除了?它说我需要在C.Um之后定义一个::someMethod。。。这里有几个问题,但无论如何这都不可能编译,因为Base
是C
的私有库。您的第一句话实际上不是真的。std::make_unique
的实例化需要查看C
的完整定义才能分配和构造实例,但是std::make_unique
的调用方不需要这样做。因此,为什么错误消息会抱怨unique\u ptr
->unique\u ptr
转换,而不是分配new C{}
。编译器将无法创建make_unique()
的隐式实例化,但这不是致命的。如果程序中的其他地方提供了有效的实例化(可能是显式的),它将发出链接器可以解析的引用
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;
}
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>>
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>();
}
}