いくつかの質問が発生したとき、(配列の動的割り当てを避けるために) 非型パラメーターを使用するテンプレート関数に取り組んでいました。私の最初の質問は、コンパイル時の変数の割り当てに関するものです。これは、テンプレート関数への次の呼び出しの試行から発生しました。
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);
}
ここでは、2 つのエラーがあります。1 つ目は、コンパイラが への呼び出しを解決できないこと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;
同じエラーが発生します。2 番目の代入はコンパイラによって許可される場合がありますが、そうするのは悪い形式と見なされますか? さらに、n
定数にすることで関数呼び出しの解決に違いが生じるのはなぜですか?
私の他の質問は vlas に関するものです: メモリはスタックまたはヒープに割り当てられていますか (そしてこれはコンパイラに依存していますか)? ベクトル (または同様のコンテナー) を優先して回避する必要がありますか?
洞察に感謝します!