免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 15111 | 回复: 11
打印 上一主题 下一主题

模板类继承问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-28 10:55 |只看该作者 |倒序浏览
template<class T>
class ResourceCloser {
protected:
        T _p;
public:
        ResourceCloser(T p = NULL) :  _p(p) {
        }
        void attach(T p) {
                if (_p) release();
                _p = p;
        }
        virtual void release() = 0;
};


class ResultSet : public ResourceCloser<oracle:: occi::ResultSet*> {
        oracle:: occi::Statement* _pstmt;
        std::map<std::string, unsigned int> _map;
public:
        ResultSet(oracle:: occi::ResultSet* p = NULL)
                : ResourceCloser<oracle:: occi::ResultSet*>(p) {
                oracle:: occi:: Statement* pstmt = p->getStatement();
                if (_pstmt != pstmt) {
                        _pstmt = pstmt;
                }
                _map.clear();
        }
        ~ResultSet() {
                if (_p) release();
        }
        virtual void release() {
                _pstmt->closeResultSet(_p);
                _p = NULL;
        }
}

如果是模板类继承的话,好像是occi::ResultSet里面的方法,例如next()等就看不到了。
如果是把下面的代码加上,就可以用。
     virtual bool next(){
            return _p->next();
        }

是不是模板类的继承会出现上述问题??
还有,怎么解决呢?

[ 本帖最后由 wanyouyinli 于 2007-7-30 10:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-28 14:20 |只看该作者
高手出来解释一下吧

论坛徽章:
0
3 [报告]
发表于 2007-07-30 10:49 |只看该作者
到底是怎么回事呢?

论坛徽章:
0
4 [报告]
发表于 2007-07-30 11:30 |只看该作者
原帖由 emuen_1982 于 2007-7-30 10:51 发表


_p是成员变量,怎么会找不到呢?
只是在模板类继承的时候才会找不到,只要加上this->就可以了,或者使用using也可以。


this->加到哪里?????

论坛徽章:
0
5 [报告]
发表于 2007-07-30 11:55 |只看该作者
是有点儿奇怪

论坛徽章:
0
6 [报告]
发表于 2007-07-30 14:05 |只看该作者
这个。。。就是说父类所有的方法都要在子类里声明一遍?那样继承不是没有意义了吗?

论坛徽章:
0
7 [报告]
发表于 2007-07-30 15:15 |只看该作者
模板类的继承跟普通的继承有什么不一样的地方?

论坛徽章:
0
8 [报告]
发表于 2007-07-30 15:16 |只看该作者
原帖由 wanyouyinli 于 2007-7-28 10:55 发表
template
class ResourceCloser {
protected:
        T _p;
public:
        ResourceCloser(T p = NULL) :  _p(p) {
        }
        void attach(T p) {
                if (_p) release();
                _p = p;
        }
        virtual void release() = 0;
...


e~~~没看懂你想问什么
occi::ResultSet并不是作为基类继承的啊
你要用它的成员当然要"指"一下

论坛徽章:
0
9 [报告]
发表于 2007-07-30 15:18 |只看该作者
原帖由 game_over 于 2007-7-30 15:15 发表
模板类的继承跟普通的继承有什么不一样的地方?

没什么不一样
就是看起来眼花一点
如果摸板再加上递归就是想起来抽筋一点

论坛徽章:
0
10 [报告]
发表于 2007-07-31 12:50 |只看该作者
模板继承和普通继承一样,不过从你的代码
template<class T>
class ResourceCloser {
...
};
class ResultSet : public ResourceCloser<oracle:: occi::ResultSet*> {
        oracle:: occi::Statement* _pstmt;
}


可以看出,ResultSet从ResourceCloser<ResultSet*> 派生,ResourceCloser<ResultSet*>是一个新的类,而不是从occi::Resultset派生。这样当然无法直接调用occi::next()函数了.

解决方法一种是向你说的,在ResultSet中将occi::ResultSet中的函数全部定义一次.

还有一种是将
class ResourceCloser {  改成
template
<class T>
class ResourceCloser : public T
{
...
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP