使用父模板类的非依赖嵌套类作为子类中的成员
Using a nondependent nested class of a parent template class as a member in a child class
我浏览了C++常见问题解答中的C++模板部分,发现了这个关于使用父模板类的非依赖嵌套类作为子类成员的示例(不编译的代码(:
template<typename T>
class B {
public:
class Xyz { ... }; ← type nested in class B<T>
typedef int Pqr; ← type nested in class B<T>
};
template<typename T>
class D : public B<T> {
public:
void g()
{
Xyz x; ← bad (even though some compilers erroneously (temporarily?) accept it)
Pqr y; ← bad (even though some compilers erroneously (temporarily?) accept it)
}
};
C++常见问题35.18
不幸的是,这也不起作用,因为这些名字(你是准备好的你坐下来了吗?(不一定是类型。"啊?!?"你说"不是打字?!?"你惊呼道。"太疯狂了,任何傻瓜都能看见是类型;看!!!"你抗议。对不起,事实是他们可能不是类型。原因是可以有专业化例如B,其中B::Xyz是数据成员。由于这种潜在的专业化,编译器不能假设Xyz是一个类型,直到它知道T。解决方案是给出编译器通过typename关键字提供提示:
因此,作者提出了there can be a specialization of B<T>, say B<Foo>, where B<Foo>::Xyz is a data member, for example.
。这是我真正不理解的部分——如何专门化一个模板类(不从中继承(将另一个成员添加到该类中,而在另一个专门化中(例如B<Baz>
(却不存在?当然,这是假设D这样的东西是静态的,如果不存在。
我是不是错过了什么?
当显式专门化类模板时,您正在为给定的模板参数完全重新定义该类。这里有一个简单的例子:
template <typename T>
struct foo
{
typedef T type;
};
template <>
struct foo<int>
{
static int type;
};
现在,如果我用除int
之外的任何其他模板参数实例化foo
,那么成员type
就是一个类型。否则,它是int
数据成员。
相关文章:
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 初始化依赖于子类的继承类的常量类成员
- C++:在子类中扩展静态 STL 容器/映射成员?
- 从子类访问模板类成员时出现"找不到标识符"错误
- 如何访问子类的新成员函数?
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 如何从子类的构造函数初始化父类的私有成员
- 父类和子类中的 C++ 同名成员
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- C++ 类成员函数的函子模板
- 构造添加了成员变量的子类
- C++基类指针调用子虚函数,为什么基类指针可以看到子类成员
- 如何访问存储在父类中的子类成员
- B2Draw子类成员函数未调用
- 带模板的继承(访问子类成员函数内父类的变量和对象)
- 如何访问子类成员
- 使用指向无法dynamic_cast的基 abstact 类的指针访问子类成员
- 非静态/静态/全局/子类成员的初始化顺序
- 如何在c++中获取子类成员
- 使用auto循环vector时使用子类成员