class A
{
public:
typedef int* pointer;
};
class B :public A
{
public:
pointer b;
};

这段代码运行没有问题,子类继承了父类定义的类型pointer。

但当普通类变成模板类时:

template<class T>
class A
{
public:
typedef T* pointer;
};
template<class T>
class B :public A<T>
{ public:
pointer b;
};

当定义一个B对象时,上述代码在g++中会报错:pointer does not name a type。

查阅资料后了解到:

N4567 § 14.6.2[temp.dep]p3

In the definition of a class or class template, the scope of a dependent base class (14.6.2.1) is not examined

during unqualified name lookup either at the point of definition of the class template or member or during

an instantiation of the class template or member.

即A<T> 中的T是模板参数,这样的类型是 dependent type 。这里,A<T> 被用作基类,于是这种基类叫做 dependent base class 。按照 C++ 标准的规定,除非显式用 基类名::成员名 的语法,否则不会查找 dependent base class 的成员。

以下面代码为例:

typedef double A;
template<class T> class B {
typedef int A;
};
template<class T> struct X : B<T> {
A a; // 此处的A为double类型
};

所以如果要使用pointer类型,需写成**typename A<T>::pointer b; **

ps:在vs2013中却能正确编译通过

【C++】子类访问父类typedef的问题的更多相关文章

  1. javascript中uber实现子类访问父类成员

    function Animal(){} Animal.prototype={ name:"animal", toString:function(){ console.log(thi ...

  2. 转:C++:从子类访问父类的私有函数

    众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能.从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员更 ...

  3. Java子类访问父类的私有成员变量

    /**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中 ...

  4. 子类覆写的变量被private隐藏,强制转换方式通过子类访问父类的被覆写变量:

    import static java.lang.System.*; public class SuperParent{ public static void main(String[] args){ ...

  5. OC 继承子类对象调用方法机制 子类对象访问父类中的实例变量

    在继承中,子类对象如何调用到正确方法的机制 每一个Objective - C对象都有一个隐藏的指针指向类的代码,当向一个对象发送消息的时候,当前的对象会首先在当前类里去查找相应的方法,如果找到的话,直 ...

  6. 牛客网Java刷题知识点之父类中的私有内容,子类是否具备? 子类不可直接,但可间接访问父类中的私有内容?

    不多说,直接上干货!  父类中的私有内容,子类是否具备? 答:不具备 子类不可直接,但可间接访问父类中的私有内容 这样情况,开发中不所见,但是,面试的时候,必考非常常见.

  7. Java vs C++:子类覆盖父类函数时缩小可访问性的不同设计

    Java 和 C++ 都是面向对象的语言,允许对象之间的继承.两个语言的继承都设置有允许子类覆盖父类的“虚函数”,加引号是因为 Java 中没有虚函数这一术语,但是我们的确可以把 Java 的所有函数 ...

  8. 关于protected在子类创建父类对象无法访问父类protected方法或成员

    子类(父类的外部包)中访问父类的protetcted属性或者方法,是不可以通过创建父类对象调用的.注意:此处不讨论同包下的父类子类,因为同包下所有类都可访问protected属性或者方法. 请参见Ja ...

  9. c++继承构造子类调用父类构造函数的问题及关于容器指针的问题及当容器里储存指针时,记得要手动释放

    看下面的一个问题: class Person { private: string name; public: Person(const string& s=""){ nam ...

随机推荐

  1. pymysql-connect阻塞

    class Connection(object): """ Representation of a socket with a mysql server. The pro ...

  2. spring controller 获取context

    想要获取context需要先熟悉spring是怎么在web容器中启动的,spring启动过程其实就是其IOC容器的启动过程,对于web程序,IOC容器启动过程即是建立上下文的过程 spring启动过程 ...

  3. 学习笔记:vue(代码篇)

    http://cn.vuejs.org/ VUE官网 http://cn.vuejs.org/v2/guide/  教程 VUE模板文件: <html lang="zh-cn" ...

  4. linux 之 source命令:

    source命令: source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录. 用法: source filen ...

  5. 高级js--(面向对象js,arguments,闭包,自调)

    1. Arguments对象    l检测参数个数 1.在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. function howManyArgs() { al ...

  6. 机器学习进阶-图像特征sift-SIFT特征点 1.cv2.xfeatures2d.SIFT_create(实例化sift) 2. sift.detect(找出关键点) 3.cv2.drawKeypoints(画出关键点) 4.sift.compute(根据关键点计算sift向量)

    1. sift = cv2.xfeatures2d.SIFT_create() 实例化 参数说明:sift为实例化的sift函数 2. kp = sift.detect(gray, None)  找出 ...

  7. day02-格式化输出

    python格式化字符串有%和{}两种 字符串格式控制符. 字符串输入数据格式类型(%格式操作符号) %%百分号标记%c字符及其ASCII码%s字符串%d有符号整数(十进制)%u无符号整数(十进制)% ...

  8. Activity启动模式(lauchMode)

    Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些理解,在此感谢原作者. 文章地址 ...

  9. 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据

    作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...

  10. APP-3-百度地图应用

    1.百度地图开发平台 http://lbsyun.baidu.com/ 1.1申请账号 1.2Android创建应用 进入百度地图开发平台->控制台->创建应用 发布版SHA1:BA:AD ...