C+中的模板实例化+; 我对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; } 模板 void test1(T(&array)[arraySize]) { 库特 由于模板参数是在编译时解析的,因此没有正常意义上的参数传递 arraySize和T都是从array参数的类型推断出来的。由于传递了int[5],arraySize和T在编译时分别变成5和int
例如,如果您声明了C+中的模板实例化+; 我对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; } 模板 void test1(T(&array)[arraySize]) { 库特 由于模板参数是在编译时解析的,因此没有正常意义上的参数传递 arraySize和T都是从array参数的类型推断出来的。由于传递了int[5],arraySize和T在编译时分别变成5和int,c++,arrays,templates,C++,Arrays,Templates,例如,如果您声明了int*abc=new int[5];,编译器将在您试图调用test1(abc)时呕吐。除了基本类型不匹配之外,int*没有足够的信息来推断数组的大小。这称为模板参数推断 调用站点的abc类型是:int(&)[5],它有两个信息组合:int和5。函数模板接受类型为T(&)[N]的参数,但调用站点的参数是,int(&)[5],因此编译器推断T为int,N为5 请阅读以下内容: (在ACCU) (在IBM) 我还想补充纳瓦兹所说的:理论是。在test1中,编译器创建了一个以T[a
int*abc=new int[5];
,编译器将在您试图调用test1(abc)
时呕吐。除了基本类型不匹配之外,int*
没有足够的信息来推断数组的大小。这称为模板参数推断
调用站点的abc
类型是:int(&)[5]
,它有两个信息组合:int
和5
。函数模板接受类型为T(&)[N]
的参数,但调用站点的参数是,int(&)[5]
,因此编译器推断T
为int
,N
为5
请阅读以下内容:
- (在ACCU)
- (在IBM)
int n=10;
int *abc = new int[n];
test1(abc);
test1<int,n>(abc);
int n=10;
int*abc=新的int[n];
测试1(abc);
测试1(abc);
然后编译将失败,编译器将声明它没有与test1(abc)函数调用或test1#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;
}
#包括
使用名称空间std;
模板空洞PrimtNeMe({CouTuy)意思是“代码> TEST 1(ABC)< /C>”,第二个没有意义。你有一个函数“代码> Test2< /Cord>,你把它当作一个数组来索引吗?另外,那个<代码> ABC[N] < /Cord>无论如何都不会编译,因为C++不支持动态大小的数组。(据我所知,甚至连C++11都没有)。我想你有C99背景?不过它在Apple llvm编译器3.0下编译得很好。我已经更新了答案。谢谢你指出这一点。