将引用数组传递给模板指针数组
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 *[]
我做错了什么?
您很好地展示了为什么不使用原始数组。
T &a[]
不是对 Ts 数组的引用,而是对 T 的引用数组 a
。也许你想要 T (&a)[]
- 对数组的引用。但这也不会飞。因为在这种情况下,您禁用衰减机制并且必须指定大小。这可以使用模板技巧来完成:
template<std::size_t N>
array_eraser(T (&a)[N]) {}
- 如果你真的想要
T& a[]
,那是不行的,T a[]
和 T& a[]
永远不兼容。
- 如果使用
array_eraser(T a[], int s)
,则数组不是按值传递,而是衰减为指针。 T a[]
和T* a
没有区别。这让我想到了你的第二个错误。 array = a;
不会复制数组,只会分配泄漏新分配数组的指针。您可以使用 std::memcpy(array,a,s);
. 复制数组
因此,除非您真的必须知道自己在做什么,否则请使用std::array
或更好的std::vector
,如果您需要运行 -时间和可修改的长度。使用 std::
进行更多输入并不是一个足够好的理由。
我有这个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 *[] 我做错了什么?
您很好地展示了为什么不使用原始数组。
T &a[]
不是对 Ts 数组的引用,而是对 T 的引用数组a
。也许你想要T (&a)[]
- 对数组的引用。但这也不会飞。因为在这种情况下,您禁用衰减机制并且必须指定大小。这可以使用模板技巧来完成:template<std::size_t N> array_eraser(T (&a)[N]) {}
- 如果你真的想要
T& a[]
,那是不行的,T a[]
和T& a[]
永远不兼容。 - 如果使用
array_eraser(T a[], int s)
,则数组不是按值传递,而是衰减为指针。T a[]
和T* a
没有区别。这让我想到了你的第二个错误。array = a;
不会复制数组,只会分配泄漏新分配数组的指针。您可以使用std::memcpy(array,a,s);
. 复制数组
因此,除非您真的必须知道自己在做什么,否则请使用std::array
或更好的std::vector
,如果您需要运行 -时间和可修改的长度。使用 std::
进行更多输入并不是一个足够好的理由。