C ++中的模板实例化

时间:2011-09-20 11:26:01

标签: c++ arrays templates

我对C ++如何实例化模板感到困惑。我有一段代码:

template <class T, int arraySize>
void test1(T (&array)[arraySize])
{
    cout << typeid(T).name() << endl;
}

template<class T>
void test2(T &array)
{
    cout << typeid(T).name() << endl;
}

int main()
{
    int abc[5];
    test1(abc);
    test2(abc);
    return 0;
}

以下是我的问题:
1。如何将数组abc的大小传递给test1(参数arraySize)?
2. C ++编译器如何确定两个模板中的T类型?

4 个答案:

答案 0 :(得分:7)

  1. 正常意义上没有参数传递,因为模板参数在编译时被解析。
  2. arraySizeT都是根据array参数的类型推断出来的。由于您在编译时分别传递int[5]arraySizeT成为5int
  3. 例如,如果您声明int* abc = new int[5];,则编译器会在您尝试调用test1(abc)时调整barf。除了基本的类型不匹配之外,int*没有足够的信息来推断数组的大小。

答案 1 :(得分:5)

它被称为模板参数推导

呼叫网站abc类型为:int(&)[5],其中包含两个信息:int5。函数模板接受类型为T(&)[N]的参数,但调用站点的参数为int(&)[5],因此编译器推断出Tint和{{1} }是N

阅读以下内容:

答案 2 :(得分:4)

在test1中,编译器创建一个模板,其中T [arraySize]是其形式。 当你调用test1(abc)时,你提供了一个int [5]类型的输入参数,模板匹配器自动匹配。

但是,如果你要写

int n=10;
int *abc = new int[n];
test1(abc);
test1<int,n>(abc);

然后编译将失败并且编译器将声称它没有匹配test1(abc)函数调用或test1&lt; int,n&gt;(abc)函数调用。

这是因为现在动态分配了abc的大小,因此abc的类型是一个具有不同类型的指针,因此没有模板可以匹配上述两个调用。

以下代码显示了一些类型

#include <iostream>
using namespace std;

template <class T> void printName() {cout<<typeid(T).name()<<endl;}

int main()
{      
    printName<int[2]>();  //type = A2_i
    printName<int*>();     //type = Pi

    getchar();
    return 0;
}

答案 3 :(得分:0)

我还要补充纳瓦兹所说的:理论是type inference