免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2176 | 回复: 4

问个成员函数特化的问题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-12-03 23:42 |显示全部楼层

  1. #include <stdio.h>

  2. class test
  3. {
  4. public:
  5.    template<typename T>
  6.    T *malloc();
  7. };
  8. template<>
  9. int *test::malloc<int>()
  10. {
  11.   printf("int\n");
  12.   return new int;
  13. }
  14. template<>
  15. double *test::malloc<double>()
  16. {
  17.   printf("double\n");
  18.   return new double;
  19. }

  20. int main ()
  21. {
  22.   test t;
  23.   //int *p = t.malloc<int>();   这样显式的指定是可以的
  24.   int *p = t.malloc();
  25. }
复制代码
这个编译不过去,问一下能不能根据返回值泛化? 必须显式的调用 t.malloc<int>();  吗

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2010-12-04 00:20 |显示全部楼层
这个例子举得不太对吧

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2010-12-04 08:21 |显示全部楼层
int *p = t.malloc(); 如果能编译通过,那么
t.malloc(); 就应该能编译通过。
对于 t.malloc();,编译器根本不知道用什么来特化。

函数返回类型的不同 不构成重载,所以 以返回值泛化 是行不通的,但是……,可以在 返回值 赋值给调用者时做文章。你等等,我写个事例代码给你

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2010-12-04 08:28 |显示全部楼层
用VC2008及GCC4.5都编译测试通过

  1. struct foo
  2. {
  3.         template<typename T> operator T*();
  4. };

  5. class test
  6. {
  7. public:
  8.         foo malloc()
  9.         {
  10.                 return foo();
  11.         }
  12. };


  13. #include <iostream>

  14. template<> foo::operator int*()
  15. {
  16.         std::cout << "int" << std::endl;
  17.         return new int;
  18. }
  19. template<> foo::operator double*()
  20. {
  21.         std::cout << "double" << std::endl;
  22.         return new double;
  23. }

  24. int main ()
  25. {
  26.         test t;
  27.         int* p1 = t.malloc();
  28.         double* p2 = t.malloc();

  29.         return 0;
  30. }
复制代码

评分

参与人数 1可用积分 +2 收起 理由
cookis + 2

查看全部评分

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-12-04 10:01 |显示全部楼层
哦,好方法,类型转换!多谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP