函索模板的简单问题

asvaboy1980 2002-12-31 10:16:17
《c++primer》第10章中的习题:
10.10 写个function template count,统计数组中某个值出现的次数。
//头文件model.h
template<class Type>
int count_swh(Type *array,Type t,int size)
{ int n=0;
for(int i=0;i<size;i++)
if(array[i]==t)
n++;
return n;
}
template<> int count_swh<string>(string *s, string &t,int size)
{ int n=0;
for(int i=0;i<size;i++)
if(strcmp(s[i],t)==0)
n++;
return n;
}
//主文件ch10.10.cpp
#include<iostream>
#include<string>
#include<cstring>
#include<stdlib.h>
using namespace std;
#include"model.h"
int main()
{ int ia[]={0,1,2,3,4,4,4,4,4,4};
double da[]={1.0,1.0,3,4,1.0,5};
char ca[]={'a','b','c','a','c','a'};
string s[]={"abc","xxm","abc","swh"};
cout<<"(ia,4,10):"<<count_swh(ia,4,10)<<endl;
cout<<"(da,1.0,6):"<<count_swh(da,1.0,6)<<endl;
cout<<"(ca,'a',strlen(ca)):"<<count_swh(ca,'a',6)<<endl;
cout<<"(s,"abc",4):"<<count_swh(s,string("abc"),4)<<endl;
system("pause");
return 0;
}
为什么在实例化string的时候会出错,jjhou书上给的答案在Devcpp中怎么无法通过编译????
...全文
62 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pythonandcpp 2003-01-02
  • 打赏
  • 举报
回复
楼上的几个回答都没有找到要点,
string可以通过strcmp的比较,也可以直接用=比较
pythonandcpp 2003-01-02
  • 打赏
  • 举报
回复
好像这个有问题
fixopen 2002-12-31
  • 打赏
  • 举报
回复
if(strcmp(s[i],t)==0)

string不可以用strcmp比较的。
对于string型的对象,可以使用==来比较的。所以,你不必对string进行部分特化。
artman 2002-12-31
  • 打赏
  • 举报
回复
int count_swh(Type *array,Type &t,int size)
^^
asvaboy1980 2002-12-31
  • 打赏
  • 举报
回复
\ch10.10.cpp
parse error before string constant

上面就是string的报错
asvaboy1980 2002-12-31
  • 打赏
  • 举报
回复
to:yecao_kinux(野草
你改了几个地方,这些改动,我之前也改过,无法通过编译,报错还是在string上
asvaboy1980 2002-12-31
  • 打赏
  • 举报
回复
楼上的,你的程序和我有什么不同,你能通过编译吗?好像不能,和我的一样
yecao_kinux 2002-12-31
  • 打赏
  • 举报
回复
你可以这样写

//<<c++primer>>第10章中的习题:
//10.10 写个function template count,统计数组中某个值出现的次数。
//头文件model.h

//主文件ch10.10.cpp
#include<iostream>
#include<string>
#include<string>
#include<cstdlib>

using namespace std;

template<class Type>
int count_swh(Type *array,Type t,int size)
{
int n=0;
for(int i=0;i<size;++i)//i++)
{
if(array[i]==t)++n;// n++;
}
return n;
}

template<>
int count_swh<string>(string *s, string t,int size)
{
int n=0;
for(int i=0;i<size;++i)//i++)
{
//if(strcmp(s[i],t)==0)n++;
if(s[i]==t)++n;
}

return n;
}

//#include"model.h"

//int main()
void main(void)
{
int ia[]={0,1,2,3,4,4,4,4,4,4};
double da[]={1.0,1.0,3,4,1.0,5};
char ca[]={'a','b','c','a','c','a'};
string s[]={"abc","xxm","abc","swh"};

cout<<"(ia,4,10):"<<count_swh(ia,4,10)<<endl;
cout<<"(da,1.0,6):"<<count_swh(da,1.0,6)<<endl;
cout<<"(ca,'a',strlen(ca)):"<<count_swh(ca,'a',6)<<endl;

cout<<"(s,'abc',4):"<<count_swh(s,string("abc"),4)<<endl;

//system("pause");

//return 0;
}

在DevC++ 4.9.6下编译通过
asvaboy1980 2002-12-31
  • 打赏
  • 举报
回复
上面的声明写错了,是
template<> int count_swh<string>(string*, string&,int);//
asvaboy1980 2002-12-31
  • 打赏
  • 举报
回复
to:fixopen(dup)
之前,我也是和你的想法一样的。如果不特化,去掉string的特化部分,在Devcpp中是无法通过编译的
然后我在model.h中加入了:
template<> int count_swh<string>(string *s, string&,int);//特化声明
但是还是无法通过编译。仅仅是string部分无法通过。
to: artman(我变,变,变)
加不加引用,好像不是关键,我加了还是一样的结果,string部分无法通过编译

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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