'typedef' C++类中自动继承吗?
Is 'typedef' automatically inherited in C++ class?
我曾经相信"typedef"不是自动继承的。但下面的代码快照暗示了一些不同的东西。
#include <iostream>
#include <type_traits>
struct A
{
typedef int X;
};
struct A_
{
typedef char X;
};
struct B : A {};
struct B_ : A, A_ {};
template< typename ... Ts >
using void_t = void;
template< typename T, typename = void >
struct has_typedef_X : std::false_type {};
template< typename T >
struct has_typedef_X< T, void_t<typename T::X> > : std::true_type {};
int main()
{
std::cout << std::boolalpha;
std::cout << has_typedef_X<A>::value << std::endl;
std::cout << has_typedef_X<A_>::value << std::endl;
std::cout << has_typedef_X<B>::value << std::endl;
std::cout << has_typedef_X<B_>::value << std::endl;
return 0;
}
输出为"true true false"。但在我看来,"has_typedef_X<B>::value
"给出"true"意味着在结构B中,X是"typedef"d。
所以,如果有人能解释这个问题或纠正我?
在线版本可在http://melpon.org/wandbox/permlink/iwZ6eZ3PoBPgyFBj[URL已更正]
父类的嵌套类型名(即成员类型)在派生类的作用域中可见,并且只要的访问说明符不是私有的,就可以访问。如果不同的基类中有多个类型具有相同的名称,则非限定名称不明确。
我发现的最相关的标准报价是:
[class.nested.type]§1
类型名称与其他名称完全遵循相同的作用域规则。[…]
[类别.成员.查找]§9
[注意:即使一个对象有多个类型为T的基类子对象,也可以明确地找到基类T中定义的静态成员、嵌套类型或枚举器。[…]
事实上,使用它的一个例子是标准,该标准指定标准容器的迭代器继承std::iterator
模板,该模板只包含嵌套的类型名称。继承的全部目的是将这些嵌套的类型名称获取到迭代器中。(在下一个标准版本(c++17)中,此示例将变得过时,建议不再使用std::iterator
。)
X
在B
和B_
的作用域中,B_
的问题是B_::X
不明确,因此模板推导失败,只剩下假has_typedef
作为唯一匹配项。
由于名称X是在两个基类中定义的,因此会导致has_typedef
中B_
的模板推导失败。
您认为typedef不是继承的,这可能来自于在不合格名称查找过程中的一些C++特性,其中不考虑基类。请参阅传播';typedef';从基于到派生类的';模板';
- C++:TypeDef使用元组
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 公共与私人继承
- 为什么当一个模板类继承自另一个模板类时,需要重新指定 typedef 并限定函数调用?
- 是无限的Typedef函数指针继承
- 'typedef' C++类中自动继承吗?
- 基类中的typedef在继承类中可见,而不是完全限定的
- 如何从通过模板继承的类中提取 typedef'd 信息?
- C++名称与typedef别名和继承的名称冲突
- 用于检测非继承typedef的特性
- typedef与继承中typename的用法