关于非模板类中的模板函数的问题

littlepboy 2008-05-09 02:32:51
我想在一个非模板类中实现一个模板函数并调用之,
这个模板函数没有参数,以下代码编译时不过,错误是:
“error C2783: 'void __thiscall CSearchFilesThread::Sum(void)' : could not deduce template argument for 'T'”

// 代码段1
class CTest
{
template <typename T>
void Sum()
{
T t = 0;
}

void Test()
{
Sum();
}
}

但是只要给这个模板函数加上参数T,就可以编译通过了:

// 代码段2
class CTest
{
template <typename T>
void Sum(T)
{
T t = 0;
}

void Test()
{
Sum(0);
}
}

但是我的应用根本不需要参数,代码段1为什么会有问题,应该如何实现?
请高手解释一下,谢谢。
...全文
333 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyinlei 2008-05-09
  • 打赏
  • 举报
回复
template <typename T>
void Sum()
{
T t = 0;
}
当调用Sum(0)时,编译器无法知道 函数体内T到底应该实例化成哪种类型。
需如此调用 Sum <int>(); //将T实例化成int类型。

template <typename T>
void Sum(T)
{
T t = 0;
}
调用Sum(0)时,根据参数0,编译器知道T实例化为int。
silendream 2008-05-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public:
template <typename T>
void test()
{
T t;
cout << "OK !" << endl;
}
};


int main()
{
A a;
a.test<int>();
}


vs2008
littlepboy 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 biosli 的回复:]
哦,我刚才使用的是VS2005可能是编译器的问题。
[/Quote]
不会真的是编译器的问题吧,这么郁闷。。。
IT_lau 2008-05-09
  • 打赏
  • 举报
回复
楼上的好像都精通VC6了,就不要在放了
taodm 2008-05-09
  • 打赏
  • 举报
回复
VC6啊,还是扔了吧。它不支持模板成员函数的。
biosli 2008-05-09
  • 打赏
  • 举报
回复
哦,我刚才使用的是VS2005可能是编译器的问题。
小人物- 2008-05-09
  • 打赏
  • 举报
回复
void Test()
{
Sum();
}
}
这样用编译器怎么知道 你的T t = 0;中的T是什么类型的啊
改为void Test()
{
Sum<Typename>();
}
Typename是某些具体的类型,如int ,double等

littlepboy 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 biosli 的回复:]
引用 4 楼 littlepboy 的回复:
引用 2 楼 taodm 的回复:
void Test()
{
Sum <XXX>();
}

你编译过么?不要随便贴代码。。。这个我早试过了。


你后面得评论真是听不好听的……你真的试了么?

下面是我编译通过的代码

C/C++ code
class TestA
{
public:
template <typename T>
void sum()
{
T t = 0;
}

void Test()
{
sum<i…
[/Quote]
我这样说的确稍欠妥当,请你不要放在心上。。。
主要因为我试过,刚才又试了一次,还是不行。
如果不把模板函数放在类里就没问题,
放到类里就编译出错,错误是:
“error C2062: type 'int' unexpected”。
是不是编译器的问题?你用的什么编译器,我用的vc6。
biosli 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 littlepboy 的回复:]
引用 2 楼 taodm 的回复:
void Test()
{
Sum <XXX>();
}

你编译过么?不要随便贴代码。。。这个我早试过了。
[/Quote]

你后面得评论真是听不好听的……你真的试了么?

下面是我编译通过的代码

class TestA
{
public:
template <typename T>
void sum()
{
T t = 0;
}

void Test()
{
sum<int>();
}
};

int main(int argc, char *argv[])
{
TestA a;
a.Test();
getchar();

return 0;
}
冷月清晖 2008-05-09
  • 打赏
  • 举报
回复
模板也称参数化类型,C++设计就这一种方法吧
biosli 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
void Test()
{
Sum <XXX>();
}
[/Quote]

同意这个说法。编译的时候要告诉编译器你T得内容。
noky 2008-05-09
  • 打赏
  • 举报
回复
模板类中的参数T实际上是需要你在运行是指定的,它相当与一个“占位符”的意思,也就是说一旦编译以后这个T必须实例化,实例化为现有的类型,
你的代码1中,没有参数,也就是说自始至终T都没有实例化,所以会出现编译错误,但是你的代码2中,你已经将T实例化为int类型了。但是你的写法有一些问题
class CTest
{
template <typename T>
void Sum(T)
{
T t = 0; // 在此处你让t = 0,表明你已经将T实例化为了int类型的,那么你在此用模板就没有任何的意义了。
}
littlepboy 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baihacker 的回复:]
因为你只写一个sum();编译器并不知道你想把模板中的T用什么替换
而加了参数就可以从参数类型推断出T的类型
[/Quote]
这个我知道,关键是除了参数还有没有其他方法?

[Quote=引用 2 楼 taodm 的回复:]
void Test()
{
Sum <XXX>();
}
[/Quote]
你编译过么?不要随便贴代码。。。这个我早试过了。

[Quote=引用 3 楼 bubu8633 的回复:]
void Sum(T)
这样也无伤大雅啊
[/Quote]
是这个参数我用不到,只定义一个类型T的临时变量作为参数就再也没有任何用处,感觉不太好。

不过还是要谢谢大家的回复:)
冷月清晖 2008-05-09
  • 打赏
  • 举报
回复
void Sum(T)
这样也无伤大雅啊
taodm 2008-05-09
  • 打赏
  • 举报
回复
void Test()
{
Sum<XXX>();
}
baihacker 2008-05-09
  • 打赏
  • 举报
回复
因为你只写一个sum();编译器并不知道你想把模板中的T用什么替换
而加了参数就可以从参数类型推断出T的类型

64,282

社区成员

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

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