VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 4339|回复: 15

[求助] 函数模板显式实例化

[复制链接]
35_avatar_middle
在线会员 Jeff_ 发表于 2018-10-24 23:40:09 | 显示全部楼层 |阅读模式
3驿站币
看c++ primer有一些问题请教下大家。
我的理解,显示具体化就相当于声明,实例化就相当于定义对象。那么实例化就可以写在主函数中吧。
书上写的也是可以实现。但我自己用VS2010就会报错。请加下哪里理解出了问题。。
QQ截图20181024232558.png
微信图片_20181024232541.png

最佳答案

查看完整内容

template void Swap( char &, char &); 扔到类之前就能运行。 作用只是加速编译吧。不用让编译器自行推导,默认使用char。 这就是显示实例化的好处吧。




上一篇:vs哪个版本现在最稳定
下一篇:菜鸟求助,编译不通过,求指教

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

75_avatar_middle
在线会员 coldBro 发表于 2018-10-24 23:40:10 | 显示全部楼层
Jeff_ 发表于 2018-10-25 11:10
- - google半天,迷迷糊糊,感觉这个显示实例化没啥大用,就是可以实现类模板定义与实现分离。但看了半 ...

template void Swap<char>( char &, char &);  
扔到类之前就能运行。
作用只是加速编译吧。不用让编译器自行推导,默认使用char。
这就是显示实例化的好处吧。

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
81_avatar_small Debug + 2 + 2 赞一个!

查看全部评分

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-10-25 00:50:06 | 显示全部楼层
main 函数上面那句楼主加了吗?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

35_avatar_middle
ico_lz  楼主| Jeff_ 发表于 2018-10-25 08:44:21 | 显示全部楼层
Syc 发表于 2018-10-25 00:50
main 函数上面那句楼主加了吗?

加了的.
zxzxzx

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-10-25 09:20:50 | 显示全部楼层

楼主不妨把代码复制一份上来,这样我们也好分析问题!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

35_avatar_middle
ico_lz  楼主| Jeff_ 发表于 2018-10-25 09:38:59 | 显示全部楼层
  1. #include <iostream>

  2. template <typename T>
  3. void Swap(T &a, T &b);

  4. struct job
  5. {
  6.     char name[40];
  7.     double salary;
  8.     int floor;
  9. };

  10. // explicit specialization
  11. template<> void Swap<job>(job &j1, job &j2);
  12. void Show(job &j);

  13. int main()
  14. {
  15.     using namespace std;
  16.     cout.precision(2);
  17.     cout.setf(ios::fixed, ios::floatfield);
  18.     int i = 10, j = 20;
  19.     cout << "i, j = " << i << ", " << j << ".\n";
  20.     cout << "Using compiler-generated int swapper:\n";
  21.     Swap(i,j);                // generates void Swap(int &, int &)

  22.    template void Swap<char>(const char &,const char &);            //这句是我自己加上去的,只是想看看是否可行


  23.     cout << "Now i, j = " << i << ", " << j << ".\n";

  24.     job sue = {"Susan Yaffee", 73000.60, 7};
  25.     job sidney = {"Sidney Taffee", 78060.72, 9};
  26.     cout << "Before job swapping:\n";
  27.     Show(sue);
  28.     Show(sidney);
  29.     Swap(sue, sidney); // uses void Swap(job &, job &)
  30.     cout << "After job swapping:\n";
  31.     Show(sue);
  32.     Show(sidney);
  33.     // cin.get();
  34.     return 0;
  35. }

  36. template <typename T>
  37. void Swap(T &a, T &b)    // general version
  38. {
  39.     T temp;
  40.     temp = a;
  41.     a = b;
  42.     b = temp;
  43. }

  44. // swaps just the salary and floor fields of a job structure

  45. template<> void Swap<job>(job &j1, job &j2)  // specialization
  46. {
  47.     double t1;
  48.     int t2;
  49.     t1 = j1.salary;
  50.     j1.salary = j2.salary;
  51.     j2.salary = t1;
  52.     t2 = j1.floor;
  53.     j1.floor = j2.floor;
  54.     j2.floor = t2;
  55. }

  56. void Show(job &j)
  57. {
  58.     using namespace std;
  59.     cout << j.name << ": $" << j.salary
  60.          << " on floor " << j.floor << endl;
  61. }
复制代码


代码是另一个例题的代码,正好看到函数实例化,我就自己试一试加了句 template void Swap<char>(const char &,const char &);    ,发现不可行。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

35_avatar_middle
ico_lz  楼主| Jeff_ 发表于 2018-10-25 09:40:17 | 显示全部楼层
Syc 发表于 2018-10-25 09:20
楼主不妨把代码复制一份上来,这样我们也好分析问题!

贴在下面了,谢谢。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

81_avatar_middle
online_moderator Debug 发表于 2018-10-25 10:20:12 | 显示全部楼层
Jeff_ 发表于 2018-10-25 09:38
代码是另一个例题的代码,正好看到函数实例化,我就自己试一试加了句 template void Swap(const char & ...

刚刚在我本机上试验了一下,vs2013也报错,看来是vs不支持这种写法了!
把那一句拿到 main 函数上面就可以了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

75_avatar_middle
在线会员 coldBro 发表于 2018-10-25 10:42:04 | 显示全部楼层
template<> void Swap<char>( char &, char &);       //少了尖括号,而且要放在类之前
像char这种类型,系统定义好的,编译器可以自行推导,不用显示的声明。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

75_avatar_middle
在线会员 coldBro 发表于 2018-10-25 10:49:08 | 显示全部楼层
应该这样理解这个尖括号:
本来是template<T>//T代表任意类型
现在你把T"拿出来"指定为char,所以尖括号里面就是空啦。这是语法。
推荐看看侯捷的STL泛型编程。
ps我是在B站看的视频版本

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

35_avatar_middle
ico_lz  楼主| Jeff_ 发表于 2018-10-25 10:51:41 | 显示全部楼层
coldBro 发表于 2018-10-25 10:42
template void Swap( char &, char &);       //少了尖括号,而且要放在类之前
像char这种类型,系统定义 ...


template<> void Swap<char>( char &, char &);     
这个写法是显示具体化吧。正好看书看到了具体化与实例化,就想着实例化有什么作用。GOOGLE下是可以实现模板类声明头文件和实现文件分离,看了半天还是云里雾里的。。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

35_avatar_middle
ico_lz  楼主| Jeff_ 发表于 2018-10-25 11:03:33 | 显示全部楼层
Debug 发表于 2018-10-25 10:20
刚刚在我本机上试验了一下,vs2013也报错,看来是vs不支持这种写法了!
把那一句拿到 main 函数上面就可 ...

其实主要还是不知道 实例化比具体化的好处或者意义是什么函数模板显式实例化

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

75_avatar_middle
在线会员 coldBro 发表于 2018-10-25 11:05:52 | 显示全部楼层
实例化指的是对象:
比如我这个类就是个模板类
CArray 我需要告诉编译器 我这个动态数组类 的对象存的是什么类型,
如:CArray<MyStruct,MyStruct&> m_Arr;  //MySturct是我自定义的结构体
显示具体化,也就是特化,就是你理解的那个东西。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

75_avatar_middle
在线会员 coldBro 发表于 2018-10-25 11:08:05 | 显示全部楼层
我自己的理解,哈哈。
感觉问题不大,会用泛型编程就行。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

35_avatar_middle
ico_lz  楼主| Jeff_ 发表于 2018-10-25 11:10:55 | 显示全部楼层
coldBro 发表于 2018-10-25 11:08
我自己的理解,哈哈。
感觉问题不大,会用泛型编程就行。

- - google半天,迷迷糊糊,感觉这个显示实例化没啥大用,就是可以实现类模板定义与实现分离。但看了半天也没看到实现分离显示实例化的代码。。头大函数模板显式实例化

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

66_avatar_middle
在线会员 ly1599285982 发表于 2018-10-26 12:03:13 | 显示全部楼层
因该是编译器缺少库文件的问题

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-16 12:22

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表