从c++中的私有模板类继承构造函数
Inheriting a constructor from a private template class in C++
为什么D
类可以编译,而C
类不能?
class A
{
public:
A(int) {}
};
template <class T>
class B : private T // Note: private base class
{
public:
using T::T;
};
class C : public B<A>
{
public:
C() : B<A>(123) {} // Error: 'class A A::A' is inaccessible
}; // within this context
using BA = B<A>;
class D : public BA
{
public:
D() : BA(123) {} // OK
};
我测试了GCC, Clang和Visual c++,它们都是一样的。将class B : private T
改为public T
可以解决这个问题。但是为什么呢?(注意using T::T
是public
)
类A
在其作用域中包含注入的类名A
(即,A::A
引用类A
,除非碰巧引用构造函数)。
类B
继承了这个,所以B
作用域中的名称A
指的是在A
作用域中注入的类名A
。但是,由于A
是B
的私有基类,所以A
作用域中的所有名称在B
中都是私有的。
类C
再次继承了这个,但是它不能访问这个A
,因为它在B
中是私有的。因此产生了错误。请注意,错误实际上是在构造B<A>
中使用名称A
。
类BA
没有这个问题,因为定义B<A>
不在任何类的作用域中,所以名称A
引用全局名称A
,而不是任何注入的类名。当然,BA
这个名字是公开的。
C
:
中限定名称A
来轻松解决此问题。class C : public B<A>
{
public:
C() : B<::A>( 123 ) {}
};
注意构造函数继承在这里不起作用。问题是访问类名称A
(在A
中注入并在B
和C
中继承),而不是访问构造函数。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- C++继承:构造函数中的字符串构造
- 继承构造函数和其他变量的解决方法
- 带有此指针的模板类多重继承构造函数不起作用?
- 虚拟继承构造函数的组装
- C++继承构造函数的可见性
- 继承构造函数(ISO 2011 SEC 12.9第7段)
- 没有C 11的继承构造函数
- 使用关键字继承构造函数时出乎意料的行为
- 继承构造函数不允许类似数组的初始化
- 从基于QObject的类继承构造函数
- 继承构造函数并提供新的重载:无参数基构造函数似乎不参与重载解析
- C++多继承构造函数
- 具有独占继承构造函数的类的值初始化
- C++ 继承构造函数重写
- 继承构造函数与转发
- 默认情况下继承构造函数 noexcept(true)
- 有没有办法在继承构造函数时访问初始值设定项列表
- 从 std::function 继承构造函数时"function returning a function"