我对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类型?
答案 0 :(得分:7)
arraySize
和T
都是根据array
参数的类型推断出来的。由于您在编译时分别传递int[5]
,arraySize
和T
成为5
和int
。例如,如果您声明int* abc = new int[5];
,则编译器会在您尝试调用test1(abc)
时调整barf。除了基本的类型不匹配之外,int*
没有足够的信息来推断数组的大小。
答案 1 :(得分:5)
它被称为模板参数推导。
呼叫网站abc
的类型为:int(&)[5]
,其中包含两个信息:int
和5
。函数模板接受类型为T(&)[N]
的参数,但调用站点的参数为int(&)[5]
,因此编译器推断出T
为int
和{{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。