【问题标题】:Passing a reference array to template pointer array将引用数组传递给模板指针数组
【发布时间】:2021-03-24 14:12:37
【问题描述】:

我有这门课:

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 中用这一行调用类:

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

我收到此错误:无法将参数 1 从 'std::string [5]' 转换为 'T *[] 我做错了什么?

【问题讨论】:

  • array = new T[s]; array = a; 不错的即时内存泄漏 ;) 分配内存并立即丢弃它。
  • 这能回答你的问题吗? Passing an array by reference

标签: c++ arrays pointers templates reference


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2011-08-01
    • 2021-09-15
    • 2013-02-15
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多