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);
}