我通过设计使用boost(反)序列化来重构没有公共默认ctor的类。我声明了一个私有的默认ctor并将boost访问类声明为好友,并且它将默认ctor用作其反序列化过程的一部分。但是除非我将默认的ctor公开,否则它无法重构std::pair。我宁愿宣布友谊,但我不知道如何。

下面是一个简化的示例:

class PrivateDC
{
private:
    friend class PrivateDCFriend;
    friend struct std::pair<int, PrivateDC>;
    PrivateDC() = default;
};
class PrivateDCFriend
{
    void f() const
    {
        PrivateDC a;                  // this works, proves friendship
        std::pair<int, PrivateDC> b;  // gets compile error
    }
};


错误是“没有匹配的构造函数,无法初始化'std :: pair '”。如果默认的ctor是public,我不会收到错误消息。
如何声明std::pair为朋友,这样可以正常工作?

最佳答案

你不能

std::pair<T, U>的默认构造要求TU都为DefaultConstructible,而PrivateDC都不是,否则,将导致std::pair的默认构造函数被从重载集中排除。

08-26 19:28