模板struct和模板函数有什么不同?

ocean1004 2008-12-06 07:01:46

#include <iostream>
using namespace std;

template <int N>
void GetValueFunc(void* pData) { return; }

template <>
void GetValueFunc<0>(void* pData)
{
return;
}

template <>
void GetValueFunc<1>(void* pData)
{
return;
}

template <int N>
struct MyValue
{
static void GetValue(void* pData) { return; }
};

template <>
struct MyValue<0>
{
static void GetValue(void* pData)
{
return;
}
};

template <>
struct MyValue<1>
{
static void GetValue(void* pData)
{
return;
}
};

int main()
{
void* lp;
GetValueFunc<0>(lp);
GetValueFunc<1>(lp);

MyValue<0>::GetValue(lp);
MyValue<1>::GetValue(lp);
return 0;
}


麻烦高手调试进去一下

GetValueFunc<1>(lp);不能被认出来
MyValue<1>::GetValue(lp);能被认出来

为什么?
...全文
334 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ocean1004 的回复:]
而且把main改成
int main()
{
void* lp;
GetValueFunc <0>(lp);
GetValueFunc <1>(lp);
for(int i = 0; i < 2; i++)
{
MyValue <i>::GetValue(lp);
}
return 0;
}
是不通过的。我知道模板是编译期决定的,i是运行期决定的,这里好像是不可能的。有高手有什么方法吗?
[/Quote]

应该不有办法,模板参数必须是编译期常量,否则无法特化.
mujiok2003 2008-12-07
  • 打赏
  • 举报
回复
mingw下一切正常,估计是你用的编译不遵守c++标准.
ocean1004 2008-12-07
  • 打赏
  • 举报
回复
而且把main改成
int main()
{
void* lp;
GetValueFunc<0>(lp);
GetValueFunc<1>(lp);
for(int i = 0; i < 2; i++)
{
MyValue<i>::GetValue(lp);
}
return 0;
}
是不通过的。我知道模板是编译期决定的,i是运行期决定的,这里好像是不可能的。有高手有什么方法吗?
ocean1004 2008-12-07
  • 打赏
  • 举报
回复
不好意思~~~~~

我的意思是GetValueFunc <1>(lp);这句会进入
template <>
void GetValueFunc<0>(void* pData)
{
return;
}
按理说应该进入:
template <>
void GetValueFunc<1>(void* pData)
{
return;
}
*******************
而MyValue <1>::GetValue(lp);这句却能进入
template <>
struct MyValue<1>
{
static void GetValue(void* pData)
{
return;
}
};

为什么?你们调试一下就知道了
airtrack 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qqwx_1986 的回复:]
是不是又是vc6的败笔

引用没有人的话,不要用vc6浪费生命了....

楼主换个编译器吧
[/Quote]up
lq651659889 2008-12-06
  • 打赏
  • 举报
回复
up
lc19890326 2008-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qqwx_1986 的回复:]
是不是又是vc6的败笔

引用没有人的话,不要用vc6浪费生命了....

楼主换个编译器吧
[/Quote]
绝对支持 本来模板相关的标准支持就不是很全面 何况VC6本身就不是很合乎标准
lc19890326 2008-12-06
  • 打赏
  • 举报
回复
确实没懂你这个函数的意图

另外 函数模板不能设定默认实参以及不能局部实例化(只能重载和全局特化) 这是和类模板的一大区别

而函数模板可以通过实参演绎来确定模板实参 这是类模板不行的
qqwx_1986 2008-12-06
  • 打赏
  • 举报
回复
是不是又是vc6的败笔

引用没有人的话,不要用vc6浪费生命了....

楼主换个编译器吧
sys0006 2008-12-06
  • 打赏
  • 举报
回复
没看懂你要干嘛


int main()
{
void* lp = NULL;
// void *lp = new int;
GetValueFunc<0>(lp);
GetValueFunc<1>(lp);

MyValue<0>::GetValue(lp);
MyValue<1>::GetValue(lp);

lc19890326 2008-12-06
  • 打赏
  • 举报
回复
我在VS2005下调试
没有错误 除了警告使用未初始化的局部变量lp

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧