将引用数组传递给模板指针数组

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;
    }
}

我在 main 中用这一行调用 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 *[] 我做错了什么?

您很好地展示了为什么不使用原始数组。

  1. T &a[] 不是对 Ts 数组的引用,而是对 T 的引用数组 a。也许你想要 T (&a)[] - 对数组的引用。但这也不会飞。因为在这种情况下,您禁用衰减机制并且必须指定大小。这可以使用模板技巧来完成:
    template<std::size_t N>
    array_eraser(T (&a)[N]) {}
    
  2. 如果你真的想要 T& a[],那是不行的,T a[]T& a[] 永远不兼容。
  3. 如果使用array_eraser(T a[], int s),则数组不是按值传递,而是衰减为指针。 T a[]T* a没有区别。这让我想到了你的第二个错误。 array = a; 不会复制数组,只会分配泄漏新分配数组的指针。您可以使用 std::memcpy(array,a,s);.
  4. 复制数组

因此,除非您真的必须知道自己在做什么,否则请使用std::array或更好的std::vector,如果您需要运行 -时间和可修改的长度。使用 std:: 进行更多输入并不是一个足够好的理由。