"使用"私有成员变量使其成为公共成员,但构造函数保持私有。例如:
class MyClass;
class Base
{
private:
Base(float v) : m_v{v} {}
float m_v;
friend MyClass;
};
class MyClass: public Base
{
public:
using Super = Base;
using Super::Super; // this is still private
using Super::m_v; // this is public
};
int main()
{
MyClass x{3.4f}; // error - calling a private constructor of class 'Base'
(void)x.m_v; // not an error
return 0;
}
除了写这样的通用ctor之外还有其他方法吗?
template<typename... Args>
MyClass(Args&&... args) : Super(std::forward<Args>(args)...) {}
答案 0 :(得分:1)
http://en.cppreference.com/w/cpp/language/using_declaration#Inheriting_constructors包含以下段落:
它具有与相应基本构造函数相同的访问权限。如果用户定义的构造函数满足constexpr构造函数要求,则为constexpr。如果删除相应的基本构造函数或者删除默认的默认构造函数,则删除它(除了构造函数被继承的基础的构造不计算)。继承构造函数不能显式实例化或显式专门化。
它指的是继承的构造函数。我不确定为什么,但看来你的方法是明确被禁止的。通常的解决方案是定义通用转发构造函数。