一个模板函数的问题
#include <iostream>
#include <cstdlib>
using namespace std;
template <class T1, class T2>
T2 min(T1 a, T2, int m, int n)//T2----没见过这样的用法,帮忙解释下~~
{
T2 t = **a;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (t > a[i][j])
t = a[i][j];
return t;
}
int main ()
{
int B[2][2] = {4, 9, 8, 1};
cout < < min(B, **B, 2, 2) < < endl;//**B赋给T2又是什么概念的? system( "pause ");
return 0;
}
平时没这样用过模板,好像在书上也没见到过这样的语法,去找过了还是没有看到,望大家帮忙讲解一下~~
我以前写过一些小程序,是不能把二维数组当作一个二维指针传递的,
这里的代码min(B, **B, 2, 2),就是a = B了,怎么没问题的?
[解决办法]
> > T2 min(T1 a, T2, int m, int n)//T2----没见过这样的用法,帮忙解释下~~
第二个参数的位置只给出类型没有给出参数名,这在C++中是合法的,这往往意味着你要会忽略这个参数。
那为什么还需要T2?你可以试着把这个参数删除,你会发现如果删掉这个参数,函数体内的第一句就无法编译通过:
T2 t = **a;
现在原因应该很明显了:因为你需要一个类型来定义一个局部变量,而这个类型又要足够泛化。
当你调用min(B, **B, 2, 2)时,编译器会自动推导两个模版参数。T2会被识别为**B的类型。
[解决办法]
这个跟模板没啥关系. 第二个参数用不上, 就不写了嘛.
int main(int argc, char**) { // 这里也用不上, 不写了.
std::cout < < argc < < std::endl;
return 0;
}
那么, 有两点比较特别:
1. 因为某些编译器, 会进行检查, 不写这个形参名字将使得编译器不报错(或警告). 比如, VC 的编译器, 采用了 "4级检查并且 '将报警当错误 ' "的选项.
2. 虽然没写形参, 但是仍然适用重载规则. 这个会在函数模板的分派中起作用.
另外, 关于 ";//**B赋给T2又是什么概念的? "
这里的意思是, 只要 "T2 "的类型信息.
只要你的心啊, 不要你的人......BT..........XD
[解决办法]
哦,不好意思。我看错了,我以为楼主说的是第二个参数。
T2 min(T1 a, T2, int m, int n)
这里T1的类型会由调用方提供的实参自动推导。你提供一个int**,T1就是int**,你提供一个int[][2],那类型就是int[][2]。这里T1是int[][2]。
一个模板函数的有关问题
一个模板函数的问题 #includeiostream#includecstdlibusingnamespacestdtemplate classT1,classT2T
