Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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)

我还想补充纳瓦兹所说的:理论是。

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

然而,如果你要写

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(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;
}
#包括
使用名称空间std;

模板空洞PrimtNeMe({CouTuy)意思是“代码> TEST 1(ABC)< /C>”,第二个没有意义。你有一个函数“代码> Test2< /Cord>,你把它当作一个数组来索引吗?另外,那个<代码> ABC[N] < /Cord>无论如何都不会编译,因为C++不支持动态大小的数组。(据我所知,甚至连C++11都没有)。我想你有C99背景?不过它在Apple llvm编译器3.0下编译得很好。我已经更新了答案。谢谢你指出这一点。