首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于C++的模板函数的类型推断问题 [已结贴,结贴人:guolihui112]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 09:51:50 楼主
    C++里模板函数可以推断类型,这我是知道的,比如以下(此函数为从十六进制表示形式的内存单元获取Type类型的值)
          template <class Type>
        void GetValueByHexString( const CString& strHex, Type& tyValue );
      这样,这个函数可以运用到这样的环境中:
          CString strHex = "12 34 56 78"
          DWORD  dwValue( 0 );
          GetValueByHexString( strHex, &dwValue );
      上面的应用可以获得dwValue 的值,可以。


    但是后来我想想这样不便书写,,便将函数改装成这样:
          template <class Type>
        Type GetValueByHexString( const CString& strHex );
    同样还是用在上面的环境中:
          CString strHex = "12 34 56 78"
          DWORD  dwValue( 0 );
          dwValue = GetValueByHexString( strHex);
      这时候编译时候就报错了。说是无法推断出来,(当然,应用时候显示指定模板参数肯定可以)。我的问题是为什么不能推断呢。
      请高手指点!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:00:401楼 得分:0
    “规定”
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:01:392楼 得分:0
    是规定不能依据返回值来推断吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:03:263楼 得分:5
    c++里函数重载对返回值还是不行的(更不要说模板),(.Net的IL规范里倒可以,呵呵),这个东西不要这样乱用,C++模板语法因为当年觉编译器不好写,所以都不成体系(尤其在函数模板上),做这些我们这些庸人都是试验出来的,还是玩玩就而已了吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:06:024楼 得分:0
    C/C++ code
    dwValue = GetValueByHexString( strHex); ----> dwValue = GetValueByHexString<DWORD>( strHex);


    返回值不能做型别推断,要明确告诉编译器你要什么类型的返回值。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:07:145楼 得分:0
    近回值不能用于模板参数推导。
    如果不想加那个参数,实在不行,干粹就显示调用得了:
    dwValue = GetValueByHexString <DWORD>(strHex);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:09:206楼 得分:0
    哦 , 现在明白了, 多谢,
    函数模板可以推断参数, 不能从返回值推断,主要原因还是C++的重载机制所限,
    感觉模板代码写起来效率挺高,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:21:057楼 得分:0
    我个人觉得模板还是要上升到一个设计思想的高度。
    不然就浪费了~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 10:52:108楼 得分:0
    返回类型如何参与重载?
    C/C++ code
    template<class Type> Type fun(){}; fun();//调用fun,这是如何判断?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 11:53:079楼 得分:15
    >主要原因还是C++的重载机制所限
    不是重载机制,是函数调用机制。调用一个函数的时候没有返回值信息,没办法推断。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hastings
    • 等级:
    发表于:2008-05-16 12:02:4710楼 得分:0
    这个有他的难处.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 12:28:4211楼 得分:0
    引用 9 楼 iambic 的回复:
    >主要原因还是C++的重载机制所限
    不是重载机制,是函数调用机制。调用一个函数的时候没有返回值信息,没办法推断。


    更加底层了些 , 透彻
    修改 删除 举报 引用 回复

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