关于模板类中,子类无法访问父类成员问题的解决方法
2017-01-08 08:53
435 查看
问题:
今天研究数据结构,按着书敲代码,发现子类中直接调用父类成员居然无法通过编译。
看了好久都没发现问题,尝试将父类private属性改为public,发现也是不行。
解决办法:
然后我想着用域作用符,居然可以。
在网上搜了一下,发现用this指针,也是可以解决这个问题的。
//
// List.h
// HelloWorld
// csdn blog:http://blog.csdn.net/u012175089
// Created by feiyin001 on 17/1/7.
// Copyright (c) 2017年 FableGame. All rights reserved.
//
#ifndef __HelloWorld__List__
#define __HelloWorld__List__
namespace Fable
{
template<typename Object>
class List
{
private:
struct Node
{
Object data;
};
public:
class const_iterator
{
private:
Node* current;
Object& retrieve()const
{
return current->data;
}
};
class iterator: public const_iterator
{
public:
Object& operator*()
{
//return retrieve(); 无法通过编译
//return const_iterator::retrieve(); 可以通过编译
return this->retrieve();
}
iterator* operator++()
{
//current = current->next;无法通过编译
//const_iterator::current = const_iterator::current->next; 可以通过编译
this->current = this->current->next;
return *this;
}
};
};
}
#endif /* defined(__HelloWorld__List__) */
原因:
对于一些编译器,例如gcc和xcode,在扫描模板类的定义的时候,就先确定每一个成员都是在哪里声明的。
但是VC++把这件事放倒了实例化的时候,而具体的顺序C++标准实际上是没有规定的。
我正在用的电脑是MacBook,xode是没有解决这个问题的,有空试试VS才行。
今天研究数据结构,按着书敲代码,发现子类中直接调用父类成员居然无法通过编译。
看了好久都没发现问题,尝试将父类private属性改为public,发现也是不行。
解决办法:
然后我想着用域作用符,居然可以。
在网上搜了一下,发现用this指针,也是可以解决这个问题的。
//
// List.h
// HelloWorld
// csdn blog:http://blog.csdn.net/u012175089
// Created by feiyin001 on 17/1/7.
// Copyright (c) 2017年 FableGame. All rights reserved.
//
#ifndef __HelloWorld__List__
#define __HelloWorld__List__
namespace Fable
{
template<typename Object>
class List
{
private:
struct Node
{
Object data;
};
public:
class const_iterator
{
private:
Node* current;
Object& retrieve()const
{
return current->data;
}
};
class iterator: public const_iterator
{
public:
Object& operator*()
{
//return retrieve(); 无法通过编译
//return const_iterator::retrieve(); 可以通过编译
return this->retrieve();
}
iterator* operator++()
{
//current = current->next;无法通过编译
//const_iterator::current = const_iterator::current->next; 可以通过编译
this->current = this->current->next;
return *this;
}
};
};
}
#endif /* defined(__HelloWorld__List__) */
原因:
对于一些编译器,例如gcc和xcode,在扫描模板类的定义的时候,就先确定每一个成员都是在哪里声明的。
但是VC++把这件事放倒了实例化的时候,而具体的顺序C++标准实际上是没有规定的。
我正在用的电脑是MacBook,xode是没有解决这个问题的,有空试试VS才行。
相关文章推荐
- 关于protected在子类创建父类对象无法访问父类protected方法或成员
- 关于子类无法访问父类protected属性和方法的问题
- c++模板类在继承中子类无法访问父类的成员
- 关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法
- 关于局域网中无法访问的解决方法
- 关于在做java的Web开发中遇到跨域访问的问题的解决方法汇总
- 关于vs2005的“应用程序配置不正确,无法运行”问题的解决方法
- 用流的方法解决“文件正由另一进程使用,因此该进程无法访问该文件” 的问题 FileStream
- PDA访问web service时,“无法连接到远程服务器”问题的解决方法
- asp中关于数据库无法更新问题的解决方法
- 关于IIS 7.0 局域网无法访问的解决方法 windows7 iis局域网不能访问
- 关于windows7 IIS 7.5和Vista IIS 7.0 局域网无法访问的解决方法
- 关于Appserv无法打开localhost问题的解决方法
- 安装完vs.2005之后,重新安装iis后无法使用http方式访问asp.net工程的页面的问题的解决方法
- 关于无法显示该网页,弹出对话框显示"Internet Explorer无法打开Internet站点xxx,已终止操作"问题的解决方法
- Error #1009: 无法访问空对象引用的属性或方法 --问过的个问题 解决了 记录下
- 关于Appserv无法打开localhost问题的解决方法
- 无法访问WinXP机器的问题解决方法
- 关于CSS中内层使用float导致外层的背景无法显示的问题的解决方法
- Java中的类成员访问控制符和继承重写父类的方法时的类成员访问控制符的相关问题