一个模板函数的有关问题

一个模板函数的问题 #includeiostream#includecstdlibusingnamespacestdtemplate classT1,classT2T

一个模板函数的问题

#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]。