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