當大量問題出現時,我正在使用非類型參數(避免動態分配數組)的模板函數。我的第一個問題涉及編譯時變量賦值。這從以下的嘗試出現在調用模板函數: 在C++中編譯vs vs運行時const變量賦值和vlas的分配
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++,似乎也存在一些爭議,應該避免使用向量(或類似的容器)嗎?
感謝任何見解!
VLA不是C++。你想C答案? –
有趣的是,我的GNU C++編譯器與vlas沒有問題,我不知道它們是C構造。 C答案會很好,謝謝你的提醒! – glinka
如果你想動態堆棧分配,你總是可以嘗試alloca()。 –