[英]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。
T &a[]
不是對 Ts 數組的引用,而是對 T 的引用數組a
。也許您想要T (&a)[]
- 對數組的引用。 但這也不會飛。 因為在這種情況下,您禁用衰減機制並且您必須指定大小。 這可以使用模板技巧來完成: template<std::size_t N> array_eraser(T (&a)[N]) {}
T& a[]
,那就是沒有 go, T a[]
和T& a[]
永遠不兼容。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.