0

我正在从不可复制的基类构造派生类。我想在初始化程序Base中聚合初始化:

// for convenience, could be any other way to disable copy
#include<boost/noncopyable.hpp>
struct Base: public boost::noncopyable{
    int a;
};
struct Derived: public Base{
    Derived(int a): Base{a} {}
};

但我得到:

error: could not convert ‘a’ from ‘int’ to ‘boost::noncopyable_::noncopyable’

据我了解,noncopyable无法初始化,足够公平。然后我可以以某种方式制作聚合初始化程序以便跳过不可复制的初始化吗?(我尝试了例如Base{{},a}没有真正理解的事情,但这也不起作用:~noncopyable受保护)。

或者我是否需要明确定义Base::Base哪个会跳过noncopyable初始化,使用它Derived::Derived而不是聚合初始化?

4

1 回答 1

0

您尝试的基类的聚合初始化

Derived(int a): Base{{}, a} {}
//                   ^^ 

如果不是的构造函数会起作用boost::noncopyableprotected请参见此处)。

最简单的解决方法应该是向基类添加构造函数。

#include <boost/core/noncopyable.hpp>

struct Base: private boost::noncopyable
{
    int a;
    Base(int a_) : a{a_} {}
};

struct Derived: public Base
{
    Derived(int a): Base{a} {}
};
于 2020-05-18T08:51:28.260 回答