有关模板非类型参数的显示特化问题

ck_chuyun 2003-08-11 02:37:59
// 程序要求定义一个模板sum,查询数组中某个值出现的次数,写个程序
// 调用它,并按顺序向其传递double、int和字符串数组,前两个用通用
// 模板,字符串数组调用显示特化模板
#include <iostream>

using namespace std;

typedef const char *PCC;

template < typename T1, typename T2, int size >
T1 sum( T2 (&tarray)[size], T2 input );

// 当我用下面的方法定义显示特化模板时编译出错
// template<> int sum<int>( PCC (&tarray)[size], PCC s2 );
// 提示,必需指定size的值
// 该模板函数的显示特化必需像下面一样将数组的长度固定下来吗?
// 为什么编译器不能像通用模板一样算出size的值???
template<> int sum<int>( PCC (&tarray)[5], PCC s2 ); // 这样正确

int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
double b[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
const char *c[5] = { "work", "hard", "work", "smart", "!" };

// 调用通用模板
cout << sum<int>( a, 2 ) << endl;
cout << sum<int>( b, 1.1) << endl;
// 调用显示特化模板
cout << sum<int>( c, c[1] ) << endl;

system( "PAUSE" );
return 0;
}

template < typename T1, typename T2, int size >
T1 sum( T2 (&tarray)[size], T2 input )
{
......
}

template<> int sum<int>( PCC (&tarray)[5], PCC s2 )
{
.......
}

程序的完整代码在下面

另外还有一个小问题,我觉得显示特化好像没有什么用,因为完全可以
定义一个普通函数来解决特定的问题,你们认为呢?
...全文
68 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevecol 2003-08-20
  • 打赏
  • 举报
回复
结贴!!
ck_chuyun 2003-08-16
  • 打赏
  • 举报
回复
用了VECTOR怎么学模板?
solotony 2003-08-16
  • 打赏
  • 举报
回复
在高级抽象中玩低级设施!

为什么不用vector呢!
oopig 2003-08-15
  • 打赏
  • 举报
回复
模板是编译时的技术,所以编译器不可能知道一个运行时候才能确定的变量值。基于这个道理,模板的值参数必须是const的。
ck_chuyun 2003-08-11
  • 打赏
  • 举报
回复
// 我只好用另一个办法实现了,把size定义为函数参数
#include <iostream>

using namespace std;

typedef const char *PCC;

template < typename T1, typename T2 >
T1 sum( T2 * tarray, int size, T2 input );

template<> int sum<int>( PCC *tarray, int size, PCC s2 );

int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
double b[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
const char *c[5] = { "work", "hard", "work", "smart", "!" };

// 调用通用模板
cout << sum<int>( a, 5, 1 ) << endl;
cout << sum<int>( b, 5, 1.1 ) << endl;
// 调用显示特化模板
cout << sum<int>( c, 5,c[1] ) << endl;

system( "PAUSE" );
return 0;
}

template < typename T1, typename T2 >
T1 sum( T2 * tarray, int size, T2 input )
{
cout << "调用通用模板" << endl;

int total = 0;

for ( int i = 0; i < size; ++i )
{
if ( input == tarray[i] )
{
++total;
}
}
return total;
}


template<> int sum<int>( PCC *tarray, int size, PCC s2 )
{
cout << "调用显示特化模板" << endl;

int total = 0;

for ( int i = 0; i < size; ++i )
{
if ( strcmp( s2, tarray[i]) == 0 )
{
++total;
}
}

return total;
}


ck_chuyun 2003-08-11
  • 打赏
  • 举报
回复
可size是非类型参数,根本就不需要经过函数推演过程,怎么说分析T2呢?和T2没关系的
ck_chuyun 2003-08-11
  • 打赏
  • 举报
回复
可size是非类型参数,根本就不需要经过函数推演过程,怎么说分析T2呢?和T2没关系的
sevecol 2003-08-11
  • 打赏
  • 举报
回复
就是亚,你的size不显式的指定的话需要分析T2才能得出来,但是你的特例化不需要分析T2,所以得不出你的
ck_chuyun 2003-08-11
  • 打赏
  • 举报
回复
template < typename T1, typename T2, int size >

size是非类型模板参数
sevecol 2003-08-11
  • 打赏
  • 举报
回复
我想
你特例化的时候,编译器应该不会去分析你的T2,所以不能得到size.
ck_chuyun 2003-08-11
  • 打赏
  • 举报
回复
// 程序要求定义一个模板sum,查询数组中某个值出现的次数,写个程序
// 调用它,并按顺序向其传递double、int和字符串数组,前两个用通用
// 模板,字符串数组调用显示特化模板
#include <iostream>

using namespace std;

typedef const char *PCC;

template < typename T1, typename T2, int size >
T1 sum( T2 (&tarray)[size], T2 input );

// 当我用下面的方法定义显示特化模板时编译出错
// template<> int sum<int>( PCC (&tarray)[size], PCC s2 );
// 提示,必需指定size的值
// 函数的显示特化必需将数组的值固定为了一个常量吗?
// 为什么编译器不能像通用模板一样算出size的值???
template<> int sum<int>( PCC (&tarray)[5], PCC s2 ); // 这样正确

int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
double b[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
const char *c[5] = { "work", "hard", "work", "smart", "!" };

// 调用通用模板
cout << sum<int>( a, 2 ) << endl;
cout << sum<int>( b, 1.1) << endl;
// 调用显示特化模板
cout << sum<int>( c, c[1] ) << endl;

system( "PAUSE" );
return 0;
}

template < typename T1, typename T2, int size >
T1 sum( T2 (&tarray)[size], T2 input )
{
cout << "调用通用模板" << endl;

int total = 0;

for ( int i = 0; i < size; ++i )
{
if ( input == tarray[i] )
{
++total;
}
}
return total;
}

template<> int sum<int>( PCC (&tarray)[5], PCC s2 )
{
cout << "调用显示特化模板" << endl;

int total = 0;

for ( int i = 0; i < 5; ++i )
{
if ( strcmp( s2, tarray[i]) == 0 )
{
++total;
}
}

return total;
}

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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