VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

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

[求助] C++ 显式具体化 问题!!!

[复制链接]
15_avatar_middle
在线会员 菜鸟从0开始 发表于 2017-11-20 20:07:29 | 显示全部楼层 |阅读模式
3驿站币
首先,这是题目 :
C++ 显式具体化   问题!!!

其次,这是我的解答。题目第一部分没问题,第二部分 编译器一直对 《显式具体化的声明》报错。
C++ 显式具体化   问题!!!

这是,报错的提示
C++ 显式具体化   问题!!!

求助,究竟哪里错了???





上一篇:SYC老大JSMgr封装的库 在MFC下对话框工程DEBUG下编译不通过,求解
下一篇:MFC子窗口控件读取一个全局变量

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

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

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

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-20 20:09:42 | 显示全部楼层
  1. //函数模板求数组中最大的数
  2. #include <iostream>

  3. template<class T>
  4. T Maxn(const T arr[],int n );
  5. //显式具体化的声明,显式具体化求 指向字符串的指针  组成的数组中最长的字符串,返回该指针
  6. template<> char* Maxn(char* arr[],int n);
  7. int main()
  8. {
  9.         using namespace std;
  10.         int a[]={56,96,59,92,29,53,25,15,58,15,99};
  11.         int n=sizeof(a)/sizeof(int);
  12.         cout <<"n = = "<<n<<endl;
  13.         cout <<"最大值为:"<<Maxn(a,n)<<endl;
  14. }
  15. //函数模板
  16. template<class T>
  17. T Maxn(const T arr[],int n )
  18. {
  19.         T temp=arr[0];
  20.         for (int i=0;i<n;++i)
  21.         {
  22.                 if(temp<arr[i])
  23.                         temp = arr[i];
  24.         }
  25.         return temp;
  26. }
  27. template<> char* Maxn(char* arr[],int n)
  28. {
  29.         int LEN[n];
  30.         for(int i = 0;i<n;++ i )
  31.             LEN[i] = strlen(arr[i]);
  32.         int max = Maxn(LEN,n);
  33.         int i = 0;
  34.         while(LEN[i] != max)
  35.         {
  36.                
  37.                 ++i;
  38.         }
  39.         return arr[i];
  40. }
复制代码

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

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

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

回复

使用道具 举报

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-20 20:20:00 | 显示全部楼层
又来求助了。。。
@Syc

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

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

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

回复

使用道具 举报

06_avatar_middle
在线会员 vcyou 发表于 2017-11-20 20:45:16 | 显示全部楼层
大神,我初学c语言,请教一下,你用的什么工具编的程,是vc++6.0吗?怎么和我的界面不一样,连错误提示都是中文的,我的是英文的。

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

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

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

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-11-21 09:53:59 | 显示全部楼层
菜鸟从0开始 发表于 2017-11-20 20:20
又来求助了。。。
@Syc


改成这样就可以了:
  1. //函数模板求数组中最大的数
  2. #include <iostream>

  3. //函数模板
  4. template<class T>
  5. T Maxn(const T arr[], int n)
  6. {
  7.         T temp = arr[0];
  8.         for (int i = 0; i < n; ++i)
  9.         {
  10.                 if (temp < arr[i])
  11.                         temp = arr[i];
  12.         }
  13.         return temp;
  14. }

  15. char* Maxn(char* arr[], int n)
  16. {
  17.         int *pArrLen = new int[n];
  18.         for (int i = 0; i < n; ++i)
  19.                 pArrLen[i] = strlen(arr[i]);

  20.         int max = Maxn(pArrLen, n);
  21.         int i = 0;
  22.         while (pArrLen[i] != max)
  23.         {
  24.                 ++i;
  25.         }
  26.         delete[] pArrLen;
  27.         return arr[i];
  28. }

  29. int main()
  30. {
  31.         using namespace std;
  32.         int a[] = { 56, 96, 59, 92, 29, 53, 25, 15, 58, 15, 99 };
  33.         int n = sizeof(a) / sizeof(int);
  34.         cout << "n = = " << n << endl;
  35.         cout << "最大值为:" << Maxn(a, n) << endl;
  36. }
复制代码

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

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

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

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-11-21 09:55:31 | 显示全部楼层
但是这样有个问题,就是当 Maxn 的参数 char* arr[] 中有两个或多个一样长度的字符串,返回的索引可能就会有问题了

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

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

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

回复

使用道具 举报

74_avatar_middle
在线会员 zuiwuchang 发表于 2017-11-21 09:59:12 | 显示全部楼层
本帖最后由 zuiwuchang 于 2017-11-21 10:32 编辑


首先 這個叫做 `模板特化` 不叫什麼 `具体化` 看得莫名其妙 看了你代碼 才知道你想 講什麼

你的錯誤 在於 需要 爲 char* 定義一個 typedef 不然 無法識別出你要 特化哪個 模板
這是 c++編譯器 還不夠智能 沒法 只有你自己 爲指針定義一個 typedef

先看下 孤改鍋後的代碼
  1. #include <iostream>
  2. #include <cstring>

  3. using namespace std;

  4. template<class T>
  5. T Maxn(const T arr[],int n );


  6. //显式具体化的声明,显式具体化求 指向字符串的指针  组成的数组中最长的字符串,返回该指针
  7. typedef char* cstr_t;
  8. template<>
  9. cstr_t Maxn(const cstr_t arr[],int n );
  10. int main()
  11. {
  12.     using namespace std;
  13.     int a[]= {56,96,59,92,29,53,25,15,58,15,99};
  14.     int n=sizeof(a)/sizeof(int);
  15.     cout <<"n = "<<n<<endl;
  16.     cout <<"max = "<<Maxn(a,n)<<endl;

  17.     char* strs[] = {"kate","cerberus","king"};
  18.     n=sizeof(strs)/sizeof(char*);
  19.     cout <<"n = "<<n<<endl;
  20.     cout <<"max = "<<Maxn(strs,n)<<endl;
  21. }

  22. template<class T>
  23. T Maxn(const T arr[],int n )
  24. {
  25.     T temp=arr[0];
  26.     for (int i=1; i<n; ++i)
  27.     {
  28.         if(temp<arr[i])
  29.             temp = arr[i];
  30.     }
  31.     return temp;
  32. }

  33. template<>
  34. cstr_t Maxn(const cstr_t strs[],int n )
  35. {
  36.     cstr_t str = strs[0];
  37.     int len = strlen(str);
  38.     for (int i=1; i<n; ++i)
  39.     {
  40.         int n = strlen(strs[i]);
  41.         if(len<n)
  42.         {
  43.             str = strs[i];
  44.             len = n;
  45.         }
  46.     }
  47.     return str;
  48. }
复制代码


代碼 第11行 爲 char* 定義了一個 typedef 模板就能正常識別了

其次 你的代碼 有幾個地方 雖然沒錯 但 需要 改進的 地方
1 孤第32行 代碼是從1開始 你是從0 開始 從0開始 是沒有意義的 你已經把0 存儲到 temp 了 幹嘛再對0操縱一次
2 特化char* 的 代碼 幹嘛要用新的 邏輯 和 定義的模板用 同樣邏輯就可以了  而且你的特化代碼 不知道在幹什麼

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

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

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

回复

使用道具 举报

74_avatar_middle
在线会员 zuiwuchang 发表于 2017-11-21 10:10:15 | 显示全部楼层
Syc 发表于 2017-11-21 09:53
改成这样就可以了:

你這種寫法 應該是叫 函數 重載 不是 模板特化哦
這樣 無法 通過 Maxn<char*>(strs,n) 的方法調用吧

如果 高層提供一個 包裝 想 自動轉到底層 調用 Maxn<T>(...) 遇到 char*
底層自動 產生的 Maxn<char*>(...) 就會調用失敗因爲 根本不存在這個 特化的 模板函數
(其實情況會更糟 編譯器不會報錯 而是 調用了 沒有特化的 模板 執行了錯誤的 邏輯)

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

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

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

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2017-11-21 10:22:18 | 显示全部楼层
zuiwuchang 发表于 2017-11-21 10:10
你這種寫法 應該是叫 函數 重載 不是 模板特化哦
這樣 無法 通過 Maxn(strs,n) 的方法調用吧

嗯,是函数重载,没真正理会题目的意思

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

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

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

回复

使用道具 举报

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-26 09:22:12 | 显示全部楼层
vcyou 发表于 2017-11-20 20:45
大神,我初学c语言,请教一下,你用的什么工具编的程,是vc++6.0吗?怎么和我的界面不一样,连错误提示都是 ...

我用的是VS2010,安装了番茄助手插件。具体可以参考@Syc 的实用C++入门入门教程

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

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

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

回复

使用道具 举报

15_avatar_middle
ico_lz  楼主| 菜鸟从0开始 发表于 2017-11-26 09:46:37 | 显示全部楼层
本帖最后由 菜鸟从0开始 于 2017-11-26 09:52 编辑

C++ 显式具体化   问题!!!
果然,我用Maxn<char*>(str,n)试了一下,编译没出错,但是运行结果不正确。

这个问题是否可以这样理解:
template<class T>
T Maxn(const T arr[],int n );这个函数模板的逻辑并不适用于char* 这种类型,所以只能采用函数重载的方式,不能适用模板函数。
如果强行适用Maxn<char*>(),会带入错误逻辑,产生错误的结果。

我这样理解对吗?

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

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

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

回复

使用道具 举报

74_avatar_middle
在线会员 zuiwuchang 发表于 2017-11-29 09:17:24 | 显示全部楼层
菜鸟从0开始 发表于 2017-11-26 09:46
果然,我用Maxn(str,n)试了一下,编译没出错,但是运行结果不正确。

这个问题是否可以这样理解:

實現 特化 和 重載是兩個不同的 東西  不能互相替代
然後所有型別都能被特化 只是因爲一些原因 (語法歧義) 一些寫法編譯器不認識 需要 你加上一些特殊東西或寫法 讓編譯器 知道你的意思
(語法歧義 類似 你和一個人講話 但中文有許多 同音不同意的詞 對方太蠢 不知道你講的哪個詞 所以你要換個 它聽得懂的詞)

孤 代碼 中 第40~55行就是在 特化 char* 因爲直接寫 char* 編譯器太蠢 不明白 所以 在 第11行 爲char* 定義了個 typedef

如果 不特化 char* 調用 Maxn 時 傳入 char* 就執行 非特化模板 也就是 孤代碼中 第28~38行代碼 自然 就是執行了 錯誤代碼

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

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

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

回复

使用道具 举报

74_avatar_middle
在线会员 zuiwuchang 发表于 2017-11-29 09:21:48 | 显示全部楼层
菜鸟从0开始 发表于 2017-11-26 09:46
果然,我用Maxn(str,n)试了一下,编译没出错,但是运行结果不正确。

这个问题是否可以这样理解:

模板 是由 編譯器 自動 爲你生成 一段 函數 類
特化模板 在於 爲特定型別 進行 特殊處理

調用 模板時 編譯器 首先根據 參數 自動 判斷 有特化模板沒? 有就調用 特化模板。 沒有就調用 非特化模板。
以函數 爲例子 一般 調用 直接和調用函數 一樣 func(args...) 編譯器 會更具 參數 型別 自動 猜測 模板原型
但有時 亦或出現 語法歧義 你也需要特殊 處理 比如 明確 寫出模板原型 func<T...>(args...)

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

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

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

回复

使用道具 举报

34_avatar_middle
在线会员 zjminsz 发表于 2017-12-15 21:11:10 | 显示全部楼层
#include <string.h>
#include <iostream>
using namespace std;

template<class T>
inline const T& maxn(const T *arr, int n)
{
        // assert(n > 0);
        int maxIndex = 0;
        int i = 0; // init i=0 just for code style, not a use value
        for (i = 1; i < n; ++i)
        {
                if (arr[maxIndex] < arr[i]) maxIndex = i;
        }

         return arr[maxIndex];
}

typedef char* PChar;
template<>
inline const PChar& maxn(const PChar *arr, int n)
{
        // assert(n > 0);
        int maxIndex = 0;
        int i = 0; // init i=0 just for code style, not a use value
        for (i = 1; i < n; ++i)
        {
                if ( strlen(arr[maxIndex]) < strlen(arr[i]) ) maxIndex = i;
        }

        return arr[maxIndex];
}

void Test_maxn()
{
#define dim(arr) ( sizeof(arr)/sizeof(*arr) )
       
        int iarr[] = {6, 5, 3, 2, 1, 4};
        cout<<maxn(iarr, dim(iarr))<<endl;

        double darr[] = {2.0, 1.0, 4.0, 3.0};
        cout<<maxn(darr, dim(darr))<<endl;

        PChar strArr[] = {"one", "two", "three", "hello", "five"};
        cout<<maxn<PChar>(strArr, dim(strArr))<<endl;
}

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

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

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

回复

使用道具 举报

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

本版积分规则

关闭

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

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

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

GMT+8, 2018-8-20 14:48

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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