簡體   English   中英

將引用數組傳遞給模板指針數組

[英]Passing a reference array to template pointer array

我有這個 class:

template<typename T>
class array_eraser
{
    T* array;
    int size_array;
public:

    array_eraser(T &a[], int s)
    {
        size_array = s;
        array = new T[s];
        array = a;
    }
}

我用這條主線調用 class:

std::string langs[] = { "C++", "Haskell", "Ada", "Python", "Ada" };
array_eraser<std::string> le(langs, sizeof(langs) / sizeof(langs[0]));

我得到了這個錯誤:無法將參數 1 從 'std::string [5]' 轉換為 'T *[] 我做錯了什么?

您很好地展示了為什么不使用原始 arrays。

  1. T &a[]不是對 Ts 數組的引用,而是對 T 的引用數組a 。也許您想要T (&a)[] - 對數組的引用。 但這也不會飛。 因為在這種情況下,您禁用衰減機制並且您必須指定大小。 這可以使用模板技巧來完成:
     template<std::size_t N> array_eraser(T (&a)[N]) {}
  2. 如果你真的想要T& a[] ,那就是沒有 go, T a[]T& a[]永遠不兼容。
  3. 如果使用array_eraser(T a[], int s) ,則數組不是按值傳遞,而是衰減為指針。 T a[]T* a之間沒有區別。 這讓我想到了你的第二個錯誤。 array = a; 不會復制 arrays 而只會分配泄漏新分配數組的指針。 您可以使用std::memcpy(array,a,s);復制數組 .

因此,除非您真的必須知道自己在做什么,否則如果您需要運行時和可修改的長度,請使用std::array或更好的std::vector 使用std::進行更多輸入並不是一個足夠好的理由。

暫無
暫無

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

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