在公共场合使用"使用"继承私有构造函数并不公开

has*_*san 5 c++ inheritance constructor

"使用"私有成员变量使其成为公共成员,但构造函数保持私有.例:

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;
}
Run Code Online (Sandbox Code Playgroud)

除了写这样的通用ctor之外还有其他方法吗?

template<typename... Args>
MyClass(Args&&... args) : Super(std::forward<Args>(args)...) {}
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 1

http://en.cppreference.com/w/cpp/language/using_declaration#Inheriting_constructors包含以下段落:

它与相应的基本构造函数具有相同的访问权限。如果用户定义的构造函数满足 constexpr 构造函数要求,则它是 constexpr。如果相应的基构造函数被删除或者默认的默认构造函数被删除(除非构造函数被继承的基构造函数不计算在内),则该构造函数也会被删除。继承构造函数不能显式实例化或显式专门化。

指的是继承的构造函数。我不知道为什么,但你的方法似乎被明确禁止。通常的解决方案是定义一个通用转发构造函数。