首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 模板问题~
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • adolthor
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-08 09:13:40 楼主
    设我有如下两个类:
    C/C++ code
    class A { //... } class B:public A { //... } //B类可以赋值给A类

    还有如下模板类:
    C/C++ code
    template <class T> class C { public: void GetFlag(C<T> a); void get(T b); }

    我想这样用:
    C <A> a;
    C <B> b;
    a.GetFlag(b);
    ---------------------------------------
    还有这样
    b bb;
    a.get(b)
    行吗?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-08-08 09:16:541楼 得分:0
    暂时看上去没有什么不行,还要看具体的东西。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 6

    发表于:2008-08-08 09:17:572楼 得分:0
    不行,类型不符合
    C <A> a;
    C <B> b;
    a.GetFlag(b);//参数得是C <A>类型的
    a.get(b);//这里参数得是A类型的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • al0n9
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:20:483楼 得分:0
    我觉得是不行的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-08-08 09:23:054楼 得分:0
    C/C++ code
    void GetFlag(C<T> a); 看楼主的意思是要把这个函数用模板了。 而楼主错误地使用在了整个类上。 class C { public: template <typename T> void GetFlag(C<T> a); void get(T b); };
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • adolthor
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:26:235楼 得分:0
    我的意思是当B能赋值给A的时候,C <B>能不能在GetFlag是把C <B>转换成C <A>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjw6861982
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:26:536楼 得分:0
    引用 2 楼 akirya 的回复:
    不行,类型不符合
    C  <A> a;
    C  <B> b;
    a.GetFlag(b);//参数得是C  <A>类型的
    a.get(b);//这里参数得是A类型的

    类型不符也行的吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • adolthor
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:27:167楼 得分:0
    刚刚测试了下,GetFlag中,G++编译不通过,而get部分可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • coverallwangp
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:27:218楼 得分:0
    引用 2 楼 akirya 的回复:
    不行,类型不符合
    C <A> a;
    C <B> b;
    a.GetFlag(b);//参数得是C <A>类型的
    a.get(b);//这里参数得是A类型的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • baihacker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 3

    发表于:2008-08-08 09:27:409楼 得分:0
    C/C++ code
    #include <iostream> using namespace std; class A { public : int Flag() const{return 1;} }; class B:public A { public : int Flag() const{return 2;} }; class C { public: template <typename T> int GetFlag(T a) { return a.Flag(); } }; int main() { A a; B b; C c; cout << c.GetFlag(a) << endl; cout << c.GetFlag(b) << endl; return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yyyapple
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:28:3310楼 得分:0
    class C
    {
    public:
        A a;
    }

    class C
    {
    public:
        B b;
    }

    这样转换会发生切割
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • steedhorse
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      3

      4

    发表于:2008-08-08 09:28:4611楼 得分:0
    只有函数可以用模板参数推导。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:29:1212楼 得分:0
    学习~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tjianli
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:35:5713楼 得分:0
    get部分能通过是因为派生类可以向基类转化,但是发生了切割,只保留了基类的部分。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:36:0114楼 得分:0
    C/C++ code
    #include <iostream> using namespace std; class A { public: protected: private: }; class B { public: protected: private: }; template<class T> class C { public: void Get(C<T> a) { } void get(T b) { } protected: private: }; void main() { C<A> a; C<B> b; C<A> c; //a.Get(b);//error a.Get(c); B bb; //a.get(bb);//error A aa; a.get(aa); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:38:0715楼 得分:0
    你的模板类C <A> C <B>本身没有继承关系
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:39:3216楼 得分:0
    引用 5 楼 adolthor 的回复:
    我的意思是当B能赋值给A的时候,C <B>能不能在GetFlag是把C <B>转换成C <A>


    应该不可以吧~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:39:5317楼 得分:0
    引用 7 楼 adolthor 的回复:
    刚刚测试了下,GetFlag中,G++编译不通过,而get部分可以


    在vs2008不能通过!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fred_fu
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:43:0018楼 得分:0
    我覺得不行。C<B>確定的類型參數為B,就不可以將類型為A的參數傳給模板,編譯時應該要報鏈接錯誤,因為在模板解析過程中出錯!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tjianli
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-08 09:46:3219楼 得分:0
    ---------------------------------------
    还有这样
    b bb;
    a.get(b)//这个不行,LZ的意思是B bb; a.get(bb);???????这个到是可以
    行吗?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved