我正在从不可复制的基类构造派生类。我想在初始化器中聚合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
中的初始化而不是聚合初始化?
答案 0 :(得分:0)
您尝试过的基类的聚合初始化
Derived(int a): Base{{}, a} {}
// ^^
如果boost::noncopyable
的构造函数不是protected
(请参阅here),则将起作用。
最简单的解决方法应该是向基类添加一个构造函数。
#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} {}
};