模板类使用friend时需要注意的一个问题
来源:互联网 发布:Ubuntu autoremove 编辑:程序博客网 时间:2024/06/05 22:54
在使用模版类封装一个B-Tree时我遇到了一个问题,我的模版类定义如下:
//节点类定义
template <class TKey,class TData,UINT TRank>
class CGRSBTreeNode
{
……
public:
friend class CGRSBTree; //注意这一行,实际不能这样使用的
};
//B-Tree类的定义
template <class TKey,class TData,UINT TRank = 10>
class CGRSBTree
{
protected:
CGRSBTreeNode<TKey,TData,TRank>* m_pRoot; //树根节点
……
};
定义的目的是使的CGRSBTree类能够访问节点类定义的私有或保护乘员,这个要求是很合理的,但是,这会引起一个编号为C3857和C2989的VC编译器(VS2008所带的10.0版本)错误。C2989意思是说,我的friend class CGRSBTree;这句已经说明CGRSBTree是一个非模板类,而我后面有声明他为模版类,编译器不干了,而C3857又认为我的这句实际上已经把CGRSBTree声明为了模版类,后面的声明是一个重复参数的声明,即不需要再声明模版参数了。为什么编译器会得出这么矛盾的错误呢?
在仔细的分析后我才发现,其实friend声明在模版类中不能这样使用,因为CGRSBTree类还没有实例化,它仅是一个没有生成任何实际类的模板而已,此处的friend实际上是一个不明确的声明,即把哪个参数实例化的CGRSBTree类当作友元,编译器不知道,模版类也不知道,我也不知道,因为我也不知道具体会怎么样实例化这两个类,当然也就无法知道具体实例化后的友元关系,这个地方的声明实际是对编译器的误导。难为编译器得出了相互矛盾的结论。
这个问题深刻说明在使用C++模版类时,有些细节的地方不能用封装类的思想来封装,这也深刻的体现了模版类和类的本质区别。
为了使这类问题不在发生,可以理解模版类为一堆类的抽象,不是具体的类,因此象friend这种需要明确类定义的语法就不能用在模版类上了。
- 模板类使用friend时需要注意的一个问题
- 使用synchronized需要注意的一个问题
- Arrays.asList()使用时需要注意的一个问题
- 使用模板模板缓冲时需要注意的几个问题
- 使用模板模板缓冲时需要注意的几个问题
- OpenGL使用模板模板缓冲时需要注意的几个问题
- OpenGL使用模板模板缓冲时需要注意的几个问题
- OpenGL使用模板模板缓冲时需要注意的几个问题
- OpenGL使用模板模板缓冲时需要注意的几个问题 .
- 使用ProGuard时需要注意的问题
- 指针使用时需要注意的问题
- 使用cloneNode时需要注意的问题
- 使用pthread时需要注意的问题
- 使用iperf时需要注意的问题
- sprintf使用时需要注意的问题
- STM32的ADC使用需要注意的一个小问题
- 使用DB2中需要注意的一个问题。
- 在MyEclipse中使用Hibernate需要注意的一个问题
- Windows 2008 Server线程池前瞻(原创)
- 机器学习(Machine Learning)- 吴恩达(Andrew Ng )-笔记
- 基于队列的最短路径搜索算法(A*算法)实现
- 基于堆栈的时间复杂度为O(n)的箱子排序算法实现
- 一个愚蠢的错误,一次深刻的教训
- 模板类使用friend时需要注意的一个问题
- 我实现的AVL树模版类
- SpringMVC 获取textarea的值
- Monkey 自动化测试
- 本田 Honda EPC 数据采集
- 我实现的红黑树C++模版类
- 我实现的B+树C++模版类(V0.50)
- MMX指令集在C++中的使用
- 关于this指针的传递问题总结