当出现许多问题时,我正在研究具有非类型参数的模板函数(以避免动态分配数组)。我的第一个问题是关于编译时变量赋值。这源于以下对模板函数的调用尝试:
template<int n>
int *getDegrees(int A[][n]) {
//return degrees
}
int main(int argc, char **argv) {
int n = 10;
int A[n][n];
int *degs = getDegrees<n>(A);
}
在这里,我们有两个错误:首先,编译器无法解析对 的调用getDegrees(A)
:
main.cc:27: error: no matching function for call to ‘getDegrees(int [(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)][(((long unsigned int)(((long int)n) + -0x00000000000000001)) + 1)])’
其次,我们无法n
在模板调用中使用,因为它不是常量表达式。简单地n
保持不变确实可以解决问题
const int n = 10;
但是,如果我要这样做
int m = 10;
const int n = m;
我们得到同样的错误。虽然编译器可能允许第二次赋值,但这样做是否被认为是不好的形式?此外,为什么让n
常量在解决函数调用时会有所不同?
我的另一个问题是关于 vlas:是在堆栈还是堆上为它们分配了内存(并且这个编译器依赖于)?甚至在 C++ 中允许它们似乎也存在一些争议,是否应该避免它们以支持向量(或类似容器)?
欣赏任何见解!