Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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+中的反向调用+;模板函数_C++_Templates - Fatal编程技术网

C++ C+中的反向调用+;模板函数

C++ C+中的反向调用+;模板函数,c++,templates,C++,Templates,我不能在模板函数中进行反向调用,尽管传递给它的参数似乎没有问题。 首先是头文件: #ifndef TestTemplate_TestTemplate_h #define TestTemplate_TestTemplate_h template<int size> void printArray(int (*iarr)[size]); #include "TestTemplate.cpp" #endif 在源文件中。 也许在模板编程中有一些语法我不知道。希望有人能指点给我。非常感

我不能在模板函数中进行反向调用,尽管传递给它的参数似乎没有问题。 首先是头文件:

#ifndef TestTemplate_TestTemplate_h
#define TestTemplate_TestTemplate_h

template<int size>
void printArray(int (*iarr)[size]);

#include "TestTemplate.cpp"
#endif
在源文件中。
也许在模板编程中有一些语法我不知道。希望有人能指点给我。非常感谢。

您不能通过使用运行时构造(如
if
)来终止模板递归(完全在编译时生成)。编译器始终必须在
printary
内部实例化
if
的两个分支,即使它“知道”其中一个分支将不会执行。这意味着您的编译时递归并没有真正终止。它可能是无限的。当编译器试图声明一个大小为
0
的数组
arr
,这是非法的,它只会以编译错误见底。这就是引发错误的原因

同样,当编译器生成
printary
时,它会实例化内部
if
的两个分支的代码,这意味着它将尝试声明

int arr[0][0] = {};
这是违法的

从编译器得到的错误消息具有误导性,可能是因为编译器实现了一些非标准扩展,允许它接受零大小的数组。实际上,错误应该由零大小的数组声明触发

如果您试图实现编译时模板递归,则必须使用编译时技术(与运行时分支相反)来实现它。在您的情况下,可以通过使用显式专门化来完成,即为大小为
1
的数组添加单独的显式专门化非递归版本的
printary

template<>
void printArray<1>(int (*iarr)[1]) {
}
这也将解决问题。(请记住,在这种情况下,它必须在递归
printArray
模板之前声明)

当然,现在您不再需要在递归版本中进行分支

template<int size>
void printArray(int (*iarr)[size]) {
    const int s = size - 1;
    cout << size << endl;
    int arr[s][s] = {};
    printArray<s>(arr);
}
模板
无效打印数组(int(*iarr)[大小]){
常数int s=大小-1;

cout哪里包括
TestTemplate.h
呢?如何调用
printary
?它应该是专用的:
printary(arr)
,包括函数本身的调用。@Stan:我照你说的做了。但仍然有那个错误。@WhozCraig:我已经将源文件包含在头文件中。你可以看到它。@tuanlong,请展示一下你如何在main中调用函数?非常感谢。我从你说的话中学到了很多东西。我会再试一次。
int arr[0][0] = {};
template<>
void printArray<1>(int (*iarr)[1]) {
}
void printArray(int (*iarr)[1]) {
}
template<int size>
void printArray(int (*iarr)[size]) {
    const int s = size - 1;
    cout << size << endl;
    int arr[s][s] = {};
    printArray<s>(arr);
}