簡體   English   中英

使用模板將可變長度二維數組傳遞給函數

[英]Passing variable-length 2D array to functions using template

這是我遇到的問題的一個例子:

#include <stdio.h>
#include <iostream>

template<std::size_t U, std::size_t V>
void func2(int (&twoDArrayA)[U][V], const int shift){
    const int length = 1 << shift;
    int twoDArrayB[length][length]; //Successful
}

//template<std::size_t A> <-- Tried to solve the problem by adding this
void func1(const int shift){
    const int length = 1 << shift;
    int twoDArrayA[length][length]; //Failed

    func2(twoDArrayA,shift);
}

int main() {
    const int shift = 3;
    func1(shift);
}

錯誤信息:

錯誤:沒有匹配的 function 調用 'func2(int [length][length], const int&)' 模板參數推導/替換失敗:可變大小數組類型 'int' 不是有效的模板參數

我認為這是因為在func2之前使用了模板,所以我嘗試在func1上做同樣的事情。 嘗試調用func1反而失敗了。 錯誤信息:

錯誤:沒有匹配的 function 調用 'func1(const int&)' 模板參數推導/替換失敗:無法推導模板參數 'A'

無論如何我可以將twoDArrayA這樣的參數傳遞給func2嗎?

func2無法推斷出數組大小,因為它在編譯時是未知的; length是根據您傳遞給func1的參數在運行時決定的。 對於使用模板 arguments 和推導的傳遞引用,您需要在編譯時具有定義大小的二維數組,例如int arr[8][8]

看起來您正在處理的代碼想要根據shift決定func1中的數組大小,然后將該數組傳遞給func2 您可能會考慮將func2設計為采用int** ,然后根據1<<shift的結果像訪問 2D 數組一樣訪問它:

void func2(int** twoDArrayA, const int shift) {
  const int length = 1 << shift;
  int last_item = twoDArrayA[length-1][length-1]
}

您還可以在這里找到一些更有用的資源!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM